Buttonのclickイベントを扱う
Javaでclickなどのイベントに反応するプログラムを作るには、イベントが発生する側とイベントを処理するクラスを分けて作ります。
イベントを通知する相手(イベントを処理するオブジェクト)のことをリスナーと呼びます。
JButtonの場合、clickされるとActionEventが発生しますので、ActionEventを通知する相手(リスナー)をJButtonオブジェクトに指定しなければなりません。ActionEventのリスナーはActionListenerです。
つまり、Buttonのclickイベントを扱うには、ActionListenerインターフェースを実装したクラスを作る必要があると言えます。
JVMはコンポーネントでイベントが発生した事を感知すると、イベントソースオブジェクトに登録されているリスナーオブジェクトを探し出し、
リスナーに実装されているインターフェース(イベントに対応するメソッド)を呼び出します。
イベントハンドリングの参考になるページ
http://www.wakhok.ac.jp/~tatsuo/kougi99/index.html
sampleではイベントソースコンポーネントがボタン、イベントをハンドリングするオブジェクトがinnerクラスExamActionListenerです。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class ExamJButtonClick extends JFrame {
JButton jb1, jb2;
JPanel jp;
public static void main(String args[]) {
ExamJButtonClick ejbc = new ExamJButtonClick();
ejbc.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
ejbc.setBounds(20,50,300,200);
ejbc.setVisible(true);
}
ExamJButtonClick() {
super("Button click");
jb1 = new JButton("Green");
jb2 = new JButton("Yellow");
// create ActionListener
ExamActionListener eal = new ExamActionListener();
// set actionListener to JButton
jb1.addActionListener(eal);
jb2.addActionListener(eal);
jp = new JPanel();
jp.add(jb1);
jp.add(jb2);
getContentPane().add(jp, BorderLayout.SOUTH);
}
class ExamActionListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
if(ae.getSource() == jb1) {
jp.setBackground(Color.green);
}
if(ae.getSource() == jb2) {
jp.setBackground(Color.yellow);
}
}
}
}
|
![]() |
プログラムを起動した状態の画面です。 |
|
![]() |
Greenボタンをclickした場合。 | |
![]() |
Yellowボタンをclickした場合。 |
getSource() method
2つのボタンのどちらがclickされたかを調べるには、ActionEventオブジェクトのgetSource()メソッドを使えば、オブジェクトが同一であるかどうか、比較可能です。
あるいは、getActionCommand()でコマンド文字列を取得します。コマンド文字列はdefaultで、Buttonのラベルテキストと同じでが、
JButtonクラスのsetActionCommand()メソッドで任意に設定できます。
actionPerformed() method
ActionListener インターフェースは、actionPerformedメソッド1つしかありませんから、対応するAdapterクラスはありません。
上のサンプルではinner classにActionListener インターフェースを使い、リスナーとして実装しています。
イベントが発生するコンポーネント(この場合はボタン)には、イベントの処理を依頼するリスナーのオブジェクトを指定するだけで、
actionPerformedメソッドを呼び出したりしません。actionPerformedメソッドを呼び出すのはJVMです。
ExamActionListenerはinnerClassですから、outerClassのメンバー変数であるボタンオブジェクトへの参照変数jb1,jb2は参照可能です。
EnterKeyに反応すするButtonの例