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 |