last modified: Feb./10th/2002
前節では、一つのイベントソースに複数のイベントリスナーを登録しました。本節では、一つのイベントリスナーを複数のイベントソースに登録します。
Java のイベント代理モデルでは、ユーザのアクションは、イベントオブジェクトとしてソースからリスナーに渡されます。このイベントオブジェクトは、イベントが発生したオブジェクト、イベントの種類など、イベント処理に必要な情報をラップしています。これらの情報は、メソッドで取得できます。
たとえば、 ActionListener インタフェースで受け取る ActionEvent クラス型オブジェクトでは、次のようなメソッドが定義されています:
| 戻り値型 | メソッド | 概要 |
String | getActionCommand() |
アクションに関連したコマンド文字列を返します。 |
int | getModifiers() |
アクションイベントの発生中に押された修飾キーを返します。 |
String | paramString() |
アクションイベントを判別するパラメータ文字列を返します。 |
また、全てのイベント状態オブジェクトの派生元になるルートクラスである EventObject では、次のメソッドが実装されています:
| 戻り値型 | メソッド | 概要 |
Object | getSource() |
イベントが最初に発生したオブジェクトです。 |
詳細は API 仕様書を参照ください。
本節では、二つのボタンそれぞれに、 ActionListener, MouseListener を登録します。それぞれのリスナーの中では、二つのボタンを識別する必要がありますが、ここでイベントオブジェクトの getSource() メソッドを利用します。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class MultiSource extends Applet {
private Button btnBlue;
EventHandler eh = new EventHandler();
private Button btnRed;
private Label label;
//リスナー内部クラス
class EventHandler implements ActionListener, MouseListener {
//ActionListener インタフェースの実装
public void actionPerformed(ActionEvent e) {
if (e.getSource() == btnBlue) {
MultiSource.this.setBackground(Color.blue);
}
if (e.getSource() == btnRed) {
MultiSource.this.setBackground(Color.red);
}
}
//MouseListener インタフェースの実装
public void mouseEntered(MouseEvent e) {
if (e.getSource() == btnBlue) {
label.setBackground(Color.blue);
}
if (e.getSource() == btnRed) {
label.setBackground(Color.red);
}
label.setForeground(Color.white);
}
public void mouseExited(MouseEvent e) {
label.setForeground(Color.black);
label.setBackground(Color.white);
}
//インタフェースのメソッドは全て実装する必要がある
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
}
//アプレットの初期化
public void init() {
//部品の作成
btnBlue = new Button("blue");
btnRed = new Button("red");
label = new Label("Color");
//部品の配置/大きさ
btnBlue.setBounds(114, 23, 56, 20);
btnRed.setBounds(29, 23, 56, 20);
label.setBounds(75, 66, 50, 20);
//Label の修飾
label.setAlignment(Label.CENTER);
//部品の配置
this.setLayout(null);
this.setSize(200, 111);
this.add(btnBlue);
this.add(btnRed);
this.add(label);
//イベントリスナーの登録
btnBlue.addActionListener(eh);
btnRed.addActionListener(eh);
btnRed.addMouseListener(eh);
btnBlue.addMouseListener(eh);
}
//アプレットの開始
public void start() {
this.setBackground(Color.white);
System.out.println("Start");
}
}
アプレット: MultiSource.class |