JavaTM 2 Platform
Standard Ed. 5.0

java.beans
クラス EventHandler

java.lang.Object
  上位を拡張 java.beans.EventHandler
すべての実装されたインタフェース:
InvocationHandler

public class EventHandler
extends Object
implements InvocationHandler

EventHandler クラスは、受信イベントオブジェクトとターゲットオブジェクトを含んだ単純な文を実行するメソッドを持つ、イベントリスナーの動的生成をサポートします。

EventHandler クラスは、開発者が Bean 間の接続を確立するために使用する、アプリケーションビルダのような対話型ツールで使用されます。通常、接続は、ユーザインタフェース Bean (イベントソース) からアプリケーションロジック Bean (ターゲット) に向けて確立されます。そのなかでも、ユーザインタフェースからアプリケーションロジックを隔離するような接続は特に効果的です。たとえば、JCheckBox とブール値を受け付けるメソッドを接続する EventHandler は、チェックボックスの状態を抽出し、これを直接メソッドに渡すことによって、メソッドをユーザインタフェース層から隔離することができます。

ユーザインタフェースを使ったイベントの処理方法としてより一般的なのは、内部クラスを使用する方法です。EventHandler クラスで処理できるのは、内部クラスで処理できるイベントのサブセットに過ぎません。しかし、長期持続スキーマでは、内部クラスよりも EventHandler のほうが優れています。また、同じインタフェースを実装している大規模なアプリケーションで EventHandler を繰り返し利用すれば、ディスクやアプリケーションのメモリフットプリントを削減できます。

EventHandler で作成されたリスナーのフットプリントが小さいのは、このクラスの依存先の Proxy クラスが同じインタフェースの実装を共有しているからです。たとえば、EventHandler create メソッドを使ってアプリケーション内のすべての ActionListener を作成する場合、すべてのアクションリスナーは、単一のクラス (Proxy クラスによって生成されたクラス) のインスタンスになります。通常、Proxy クラスのリスナーを使用する場合は、「リスナー型」(インタフェース) ごとにリスナークラスを 1 つずつ作成する必要があります。しかし、内部クラスを使用する方法では、リスナー (インタフェースを実装するオブジェクト) ごとにクラスを 1 つずつ作成するだけで済みます。

通常、EventHandler のインスタンスを直接扱うことはありません。その代わりに、EventHandlercreate メソッドを使って、指定されたリスナーインタフェースを実装するオブジェクトを作成します。このリスナーオブジェクトは、内部で EventHandler オブジェクトを使って、イベントに関する情報、イベント発生時にメッセージを送信されるオブジェクト、送信されるメッセージ (メソッド)、メソッドの引数をカプセル化します。以下では、例を使って、create メソッドによるリスナーオブジェクトの作成方法について説明します。

イベントハンドラの使用例

ターゲットオブジェクト上のメソッドを引数なしで呼び出すリスナーをインストールするというのが、もっとも単純な EventHandler の利用方法です。次の例では、javax.swing.JFrame のインスタンス上の toFront メソッドを呼び出す ActionListener を作成します。
myButton.addActionListener( (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));
myButton を押すと、frame.toFront() 文が実行されます。コンパイル時の型保証を追加しても、同じ結果が得られます。このためには、ActionListener インタフェースの新しい実装を定義し、そのインスタンスをボタンに追加します。
//Equivalent code using an inner class instead of EventHandler.myButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.toFront();
 }});
次に単純な利用方法として、リスナーインタフェース (通常はイベントオブジェクト) 内のメソッドの最初の引数からプロパティ値を抽出し、これを使ってターゲットオブジェクト内のプロパティ値を設定する例を紹介します。この例では、ターゲットオブジェクトの nextFocusableComponent プロパティをイベントのソースプロパティの値に設定する ActionListener を作成します。
EventHandler.create(ActionListener.class, target, "nextFocusableComponent", "source")
これは、次の内部クラス実装に対応しています。
//Equivalent code using an inner class instead of EventHandler.new ActionListener() { public void actionPerformed(ActionEvent e) { button.setNextFocusableComponent((Component)e.getSource());
  }}
イベントオブジェクトのソースからプロパティ値を抽出し、この値をターゲットオブジェクトのプロパティ値として設定するというのが、おそらく最も一般的な EventHandler の利用方法でしょう。次の例では、ターゲットオブジェクトの label プロパティを、イベントのソースの text プロパティの値 (source プロパティの値) に設定する ActionListener を作成します。
EventHandler.create(ActionListener.class, button, "label", "source.text")
これは、次の内部クラス実装に対応しています。
//Equivalent code using an inner class instead of EventHandler.new ActionListener { public void actionPerformed(ActionEvent e) { button.setLabel(((JTextField)e.getSource()).getText());
  }}
イベントプロパティは、ピリオド (.) で区切られた任意の数のプロパティ接頭辞によって修飾されます。ピリオドの前に表示される完全指定名は、イベントオブジェクトに適用されるプロパティ (左から順に適用) の名前として扱われます。

たとえば、次のようなアクションリスナーがあります。

EventHandler.create(ActionListener.class, target, "a", "b.c.d")
このアクションリスナーは、次の内部クラスとして書き込まれます (すべてのプロパティが正規の get メソッドを持ち、適切な型を返すものと想定)。
//Equivalent code using an inner class instead of EventHandler.new ActionListener { public void actionPerformed(ActionEvent e) { target.setA(e.getB().getC().isD());
  }}

導入されたバージョン:
1.4
関連項目:
Proxy, EventObject

コンストラクタの概要
EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
          新しい EventHandler オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく create メソッドを使用するのが一般的)。
 
メソッドの概要
static
<T> T
create(Class<T> listenerInterface, Object target, String action)
          リスナーインタフェース内のすべてのメソッドがハンドラの actiontarget に適用するための listenerInterface 実装を作成します。
static
<T> T
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName)
          すべてのメソッドから、イベント式 eventPropertyName の値を文中の最後のメソッドである action (target に適用される) に渡すための listenerInterface 実装を作成します。
static
<T> T
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
          listenerMethodName という名前のメソッドから、イベント式の値 eventPropertyName を文中の最後のメソッド action (target に適用される) に渡すための listenerInterface 実装を作成します。
 String getAction()
          このイベントハンドラによって設定されるターゲットの書き込み可能なプロパティ、またはこのイベント ハンドラがターゲット上で呼び出すメソッドの名前を返します。
 String getEventPropertyName()
          ターゲットに適用されるアクションで使用されるイベントのプロパティを返します。
 String getListenerMethodName()
          アクションをトリガするメソッドの名前を返します。
 Object getTarget()
          このイベントハンドラがメッセージの送信先とするオブジェクトを返します。
 Object invoke(Object proxy, Method method, Object[] arguments)
          イベントから適切なプロパティ値を抽出し、この EventHandler に関連付けられているアクションに渡します。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

コンストラクタの詳細

EventHandler

public EventHandler(Object target,
                    String action,
                    String eventPropertyName,
                    String listenerMethodName)
新しい EventHandler オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく create メソッドを使用するのが一般的)。

パラメータ:
target - アクションを実行するオブジェクト
action - ターゲット上の書き込み可能なプロパティまたはメソッドの (完全指定された) 名前
eventPropertyName - 受信イベントの読み込み可能なプロパティの (完全指定された) 名前
listenerMethodName - アクションをトリガするリスナーインタフェース内のメソッドの名前
関連項目:
EventHandler, create(Class, Object, String, String, String), getTarget(), getAction(), getEventPropertyName(), getListenerMethodName()
メソッドの詳細

getTarget

public Object getTarget()
このイベントハンドラがメッセージの送信先とするオブジェクトを返します。

戻り値:
このイベントハンドラのターゲット
関連項目:
EventHandler(Object, String, String, String)

getAction

public String getAction()
このイベントハンドラによって設定されるターゲットの書き込み可能なプロパティ、またはこのイベント ハンドラがターゲット上で呼び出すメソッドの名前を返します。

戻り値:
このイベントハンドラのアクション
関連項目:
EventHandler(Object, String, String, String)

getEventPropertyName

public String getEventPropertyName()
ターゲットに適用されるアクションで使用されるイベントのプロパティを返します。

戻り値:
イベントのプロパティ
関連項目:
EventHandler(Object, String, String, String)

getListenerMethodName

public String getListenerMethodName()
アクションをトリガするメソッドの名前を返します。戻り値 null は、リスナーインタフェース内のすべてのメソッドがアクションをトリガすることを表します。

戻り値:
アクションをトリガするメソッドの名前
関連項目:
EventHandler(Object, String, String, String)

invoke

public Object invoke(Object proxy,
                     Method method,
                     Object[] arguments)
イベントから適切なプロパティ値を抽出し、この EventHandler に関連付けられているアクションに渡します。

定義:
インタフェース InvocationHandler 内の invoke
パラメータ:
proxy - プロキシオブジェクト
method - リスナーインタフェース内のメソッド
arguments - プロキシインスタンスでのメソッド呼び出し時に渡される引数値を格納するオブジェクト配列。インタフェースメソッドが引数をとらない場合、null となる。プリミティブ型引数は java.lang.Integer または java.lang.Boolean のような適切なプリミティブ型ラッパークラスのインスタンスにラップされる
戻り値:
ターゲットにアクションを適用した結果
関連項目:
EventHandler

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action)
リスナーインタフェース内のすべてのメソッドがハンドラの actiontarget に適用するための listenerInterface 実装を作成します。このメソッドは、その他のより一般的な create メソッドの実装と null 値をとる eventPropertyName および listenerMethodName を呼び出すことによって実装されます。

以下は、dialog.show() を使って、JDialog を表示する ActionListener を作成する例です。

EventHandler.create(ActionListener.class, dialog, "show")

パラメータ:
listenerInterface - 作成されたプロキシを利用するリスナーインタフェース
target - アクションを実行するオブジェクト
action - ターゲット上の書き込み可能なプロパティまたはメソッドの名前
戻り値:
listenerInterface を実装するオブジェクト
関連項目:
create(Class, Object, String, String)

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action,
                           String eventPropertyName)
すべてのメソッドから、イベント式 eventPropertyName の値を文中の最後のメソッドである action (target に適用される) に渡すための listenerInterface 実装を作成します。このメソッドは、より一般的な create メソッドの実装と null 値をとる listenerMethodName を呼び出すことによって実装されます。

次のコードを使って、JLabel のテキストを受信イベントの JTextField ソースのテキスト値に設定するような ActionListener を作成できます。

EventHandler.create(ActionListener.class, label, "text", "source.text");
これは次のコードと等価です。
//Equivalent code using an inner class instead of EventHandler.label.setText((JTextField(event.getSource())).getText()) 

パラメータ:
listenerInterface - 作成されたプロキシを利用するリスナーインタフェース
target - アクションを実行するオブジェクト
action - ターゲット上の書き込み可能なプロパティまたはメソッドの名前
eventPropertyName - 受信イベントの読み込み可能なプロパティの (完全指定された) 名前
戻り値:
listenerInterface を実装するオブジェクト
関連項目:
create(Class, Object, String, String, String)

create

public static <T> T create(Class<T> listenerInterface,
                           Object target,
                           String action,
                           String eventPropertyName,
                           String listenerMethodName)
listenerMethodName という名前のメソッドから、イベント式の値 eventPropertyName を文中の最後のメソッド action (target に適用される) に渡すための listenerInterface 実装を作成します。

eventPropertyNamenull の場合、実装は、action に指定された名前のメソッドを呼び出します。EventObject を受け付けるメソッドが定義されていない場合、このアクションは EventObject または同じ名前の引数なしのメソッドをとります。

listenerMethodNamenull の場合は、インタフェース内のすべてのメソッドが、target 上で実行される action をトリガします。

たとえば、マウスボタンを押すたびにターゲットオブジェクトの origin プロパティを受信する MouseEvent の場所 (mouseEvent.getPoint() の値) に設定する MouseListener を作成したい場合は、次のように記述します。

EventHandler.create(MouseListener.class, "mousePressed", target, "origin", "point");
これは、mousePressed を除くすべてのメソッドが操作不能である MouseListener の記述と同じです。
//Equivalent code using an inner class instead of EventHandler.new MouseAdapter() { public void mousePressed(MouseEvent e) { target.setOrigin(e.getPoint());
 }} 

パラメータ:
listenerInterface - 作成されたプロキシを利用するリスナーインタフェース
target - アクションを実行するオブジェクト
action - ターゲット上の書き込み可能なプロパティまたはメソッドの名前
eventPropertyName - 受信イベントの読み込み可能なプロパティの (完全指定された) 名前
listenerMethodName - アクションをトリガするリスナーインタフェース内のメソッドの名前
戻り値:
listenerInterface を実装するオブジェクト
関連項目:
EventHandler

JavaTM 2 Platform
Standard Ed. 5.0

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java 2 SDK SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。