複数のソース

last modified: Feb./10th/2002

前節では、一つのイベントソースに複数のイベントリスナーを登録しました。本節では、一つのイベントリスナーを複数のイベントソースに登録します。

イベントオブジェクト

Java のイベント代理モデルでは、ユーザのアクションは、イベントオブジェクトとしてソースからリスナーに渡されます。このイベントオブジェクトは、イベントが発生したオブジェクト、イベントの種類など、イベント処理に必要な情報をラップしています。これらの情報は、メソッドで取得できます。

たとえば、 ActionListener インタフェースで受け取る ActionEvent クラス型オブジェクトでは、次のようなメソッドが定義されています:

ActionEvent のメソッド
戻り値型メソッド概要
StringgetActionCommand() アクションに関連したコマンド文字列を返します。
intgetModifiers() アクションイベントの発生中に押された修飾キーを返します。
StringparamString() アクションイベントを判別するパラメータ文字列を返します。

また、全てのイベント状態オブジェクトの派生元になるルートクラスである EventObject では、次のメソッドが実装されています:

EventObject のメソッド
戻り値型メソッド概要
ObjectgetSource() イベントが最初に発生したオブジェクトです。

詳細は 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


Copyright © 2001 SUGAI, Manabu. All Rights Reserved.