イベント処理とGUIが実装できる言語では定義されている。
Java言語では発生したイベントごとに対応したメソッドが用意されている
基本イベントリスナー
イベントリスナー名 | インタフェイス名 | 主な操作 | 主な対応部品 |
---|---|---|---|
actionPerformed(ActionEvent e) | ActionListener | クリック、ダブルクリック、Enterキー | ボタンなど多数の部品が搭載 |
textValueChanged(TextEvent e) | TextListener | テキスト変更変更 | テキストボックス |
itemStateChanged(ItemEvent e) | ItemListener | 選択、チェックする | リスト、チェックボックス |
adjustmentValueChanged(AdjustmentEvent e) | AdjustmentListener | スクロール移動 | スクロールバー |
windowStateChanged(WindowEvent e) | WindowStateListener | ウィンドウの状態遷移 | ウィンドウ、ダイアログ |
これらインタフェイスは1メソッドだけなのでimplementsで実装するだけでよい。
ウィンドウ系イベントリスナー
インタフェイス名 | イベントリスナー名 | 主な操作 |
---|---|---|
windowListener | windowOpened(WindowEvent e) | ウィンドウが表示されたとき |
windowClosing(WindowEvent e) | ウィンドウを閉じる操作を開始したとき | |
windowClosed(WindowEvent e) | ウィンドウを閉じ終えたとき | |
windowIconified(WindowEvent e) | 最小化したとき | |
windowDeiconified(WindowEvent e) | 最小化から通常サイズに戻したとき |
フォーカスイベントリスナーとswing.eventパッケージのイベントリスナー
インタフェイス名 | イベントリスナー名 | 主な操作 |
---|---|---|
FocusListener | focusGained(FocusEvent e) | フォーカスを当てたとき |
focusLost(FocusEvent e) | フォーカスを離したとき | |
ListSelectionListener | valueChanged(ListSelectionEvent e) | 選択内容の変更 |
用意されているパラメータの量が多いので後日とりあげます。
■○○Listenerと○○Adapterクラス
部品にイベントリスナーを登録(登録しないと何もおきない)するためメソッドがあり、
addActionListner(リスナー)のようにインタフェイス名(上記の3つの表参考)のまえに「add」が付いているメソッドである(これが有無使用可能かわかる)
ここで注意しなければいけないのは引数である。
引数:対応したインタフェイスを実装したクラスオブジェクト
つまり上記の1つ目の表のイベントだけなら「this」でもいいということになるしかし「MouseListener」と「KeyListener」と「FocusListener」と「windowListener」
は複数メソッドのインタフェイスである。
インタフェイスの性質上用意されているすべてのメソッドを実装しなければならない。
なのでいらないイベントも実装しなくてはならない。そのためインタフェイスを実装済みのアダプタークラスを継承したクラスオブジェクトで解決できる。
ただしGUIはJFrameをすでに継承しているので内部クラスを利用する。
記述例
public class MyMain extends JFrame{
public MyMain(){
JButton btn = new JButton();
btn.addActionListener(new MyAdapter());
}
class MyAdapter extends KeyListener implemetsActionListener{ public void actionPerformed(ActionEvent e) { } }
}
■無名クラス
イベント処理メソッド
イベントを発生したあと部品の情報を取得する。(この段階ではObject型)
取得したオブジェクトをそれぞれの部品にキャストして処理を実行
という流れだが当然 部品のごと処理を分ける処理も必要(クリックできる部品はたくさんあるため)
しかし部品とメソッドが1:1のときは無名クラスを使う
記述例
public class MyMain extends JFrame{
public MyMain(){
JButton btn = new JButton();
btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { /*処理*/ } } );
}
}
awtで作成するときは終了オプションが用意されていなかったので無名クラスで定義していた。
■サンプル
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GUIEvent extends JFrame{
TextField text1,text2;
JButton btn;
JLabel output;
JCheckBox check;
JTextArea area;
JComboBox combo;
JList list;
JScrollBar bar;
public static void main(String [] arge) { new GUIEvent(); }
public GUIEvent(){
final String [] list_item = {"日本","イギリス","ロシア","アメリカ","フランス","ドイツ"};
final String [] combo_item = {"東京","名古屋","大阪","福岡","北海道","沖縄"};
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600,390);
setTitle("JavaでGUIその3");
setLayout(new GridLayout(3,1));
JPanel center = new JPanel(new BorderLayout());
JPanel panel = new JPanel(new GridLayout(2,1));
JPanel head = new JPanel(new FlowLayout());
JPanel footer = new JPanel(new FlowLayout());
output = new JLabel("実行される部品を表示する ");
btn = new JButton("実行");
area = new JTextArea("ここにログが表示されます",10,10);
bar = new JScrollBar(JScrollBar.VERTICAL, 100, 20, 0, 1000);
list = new JList(list_item);
combo = new JComboBox(combo_item);
check = new JCheckBox("チェック項目",false);
text1 = new TextField(7);
text2 = new TextField(7);
addWindowListener(new WindowAdapter(){
public void windowIconified(WindowEvent e){
setTitle("最小化");
}
public void windowDeiconified(WindowEvent e){
setTitle("JavaでGUIその3");
}
});
bar.addAdjustmentListener(new AdjustmentListener(){
public void adjustmentValueChanged(AdjustmentEvent e){
output.setText("スクロールバーを動かしました。 ");
area.setText(area.getText()+"\n AdjustmentEventが実行された");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
output.setText("ボタンをクリックしました。 ");
area.setText(area.getText()+"\n ActionEventが実行された");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
list.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
int i = list.getSelectedIndex();
output.setText("JListで選択されている項目が変更されました ");
area.setText(area.getText()+"\n ListSelectionEventが実行された:"+ list_item[i]);
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
combo.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
output.setText("コンボボックスで選択されている項目が変更されました");
area.setText(area.getText()+"\n ItemEventが実行された:"+ combo.getSelectedItem());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
check.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
String state;
if(check.isSelected()){
state = "チェックしました";
} else {
state = "チェックをはずしました";
}
output.setText("チェックボックスの選択が変更されました ");
area.setText(area.getText()+"\n ItemEventが実行された:"+ state);
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text1.addTextListener(new TextListener(){
public void textValueChanged(TextEvent e){
JTextField t = (JTextField)e.getSource();
output.setText("テキストボックスの値が変更されました ");
area.setText(area.getText()+"\n TextEventが実行された:" + t.getName());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text2.addTextListener(new TextListener(){
public void textValueChanged(TextEvent e){
JTextField t = (JTextField)e.getSource();
output.setText("テキストボックスの値が変更されました ");
area.setText(area.getText()+"\n TextEventが実行された:" + t.getName());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text1.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e){
output.setText("フォーカスが移動しました。 ");
area.setText(area.getText() + "\n FoucsEventが発生した");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text2.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e){
output.setText("フォーカスが移動しました。 ");
area.setText(area.getText() + "\n FoucsEventが発生した");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
center.add(area,BorderLayout.CENTER);
center.add(bar,BorderLayout.EAST);
panel.add(output);
panel.add(btn);
head.add(list);
head.add(combo);
head.add(check);
head.add(panel);
footer.add(new JLabel("入力1"));
footer.add(text1);
footer.add(new JLabel("入力2"));
footer.add(text2);
add(head);
add(center);
add(footer);
setVisible(true);
}
}

今回は無駄に多種多様な部品を配置してすべて無名クラスでイベント実行させてみました。
次回は「JList」に挑戦します