|
JavaTM 2 Platform Standard Ed. 5.0 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
java.lang.Objectjava.beans.EventHandler
public class EventHandler
EventHandler クラスは、受信イベントオブジェクトとターゲットオブジェクトを含んだ単純な文を実行するメソッドを持つ、イベントリスナーの動的生成をサポートします。
EventHandler クラスは、開発者が Bean 間の接続を確立するために使用する、アプリケーションビルダのような対話型ツールで使用されます。通常、接続は、ユーザインタフェース Bean (イベントソース) からアプリケーションロジック Bean (ターゲット) に向けて確立されます。そのなかでも、ユーザインタフェースからアプリケーションロジックを隔離するような接続は特に効果的です。たとえば、JCheckBox とブール値を受け付けるメソッドを接続する EventHandler は、チェックボックスの状態を抽出し、これを直接メソッドに渡すことによって、メソッドをユーザインタフェース層から隔離することができます。
ユーザインタフェースを使ったイベントの処理方法としてより一般的なのは、内部クラスを使用する方法です。EventHandler クラスで処理できるのは、内部クラスで処理できるイベントのサブセットに過ぎません。しかし、長期持続スキーマでは、内部クラスよりも EventHandler のほうが優れています。また、同じインタフェースを実装している大規模なアプリケーションで EventHandler を繰り返し利用すれば、ディスクやアプリケーションのメモリフットプリントを削減できます。
EventHandler で作成されたリスナーのフットプリントが小さいのは、このクラスの依存先の Proxy クラスが同じインタフェースの実装を共有しているからです。たとえば、EventHandler create メソッドを使ってアプリケーション内のすべての ActionListener を作成する場合、すべてのアクションリスナーは、単一のクラス (Proxy クラスによって生成されたクラス) のインスタンスになります。通常、Proxy クラスのリスナーを使用する場合は、「リスナー型」(インタフェース) ごとにリスナークラスを 1 つずつ作成する必要があります。しかし、内部クラスを使用する方法では、リスナー (インタフェースを実装するオブジェクト) ごとにクラスを 1 つずつ作成するだけで済みます。
通常、EventHandler のインスタンスを直接扱うことはありません。その代わりに、EventHandler の create メソッドを使って、指定されたリスナーインタフェースを実装するオブジェクトを作成します。このリスナーオブジェクトは、内部で 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());
}}
イベントプロパティは、ピリオド (.) で区切られた任意の数のプロパティ接頭辞によって修飾されます。ピリオドの前に表示される完全指定名は、イベントオブジェクトに適用されるプロパティ (左から順に適用) の名前として扱われます。
たとえば、次のようなアクションリスナーがあります。
このアクションリスナーは、次の内部クラスとして書き込まれます (すべてのプロパティが正規の get メソッドを持ち、適切な型を返すものと想定)。EventHandler.create(ActionListener.class, target, "a", "b.c.d")
//Equivalent code using an inner class instead of EventHandler.new ActionListener { public void actionPerformed(ActionEvent e) { target.setA(e.getB().getC().isD());
}}
Proxy,
EventObject| コンストラクタの概要 | |
|---|---|
EventHandler(Object target,
String action,
String eventPropertyName,
String listenerMethodName)
新しい EventHandler オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく create メソッドを使用するのが一般的)。 |
|
| メソッドの概要 | ||
|---|---|---|
static
|
create(Class<T> listenerInterface,
Object target,
String action)
リスナーインタフェース内のすべてのメソッドがハンドラの action を target に適用するための listenerInterface 実装を作成します。 |
|
static
|
create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName)
すべてのメソッドから、イベント式 eventPropertyName の値を文中の最後のメソッドである action (target に適用される) に渡すための listenerInterface 実装を作成します。 |
|
static
|
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 |
| コンストラクタの詳細 |
|---|
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()| メソッドの詳細 |
|---|
public Object getTarget()
EventHandler(Object, String, String, String)public String getAction()
EventHandler(Object, String, String, String)public String getEventPropertyName()
EventHandler(Object, String, String, String)public String getListenerMethodName()
null は、リスナーインタフェース内のすべてのメソッドがアクションをトリガすることを表します。
EventHandler(Object, String, String, String)
public Object invoke(Object proxy,
Method method,
Object[] arguments)
EventHandler に関連付けられているアクションに渡します。
InvocationHandler 内の invokeproxy - プロキシオブジェクトmethod - リスナーインタフェース内のメソッドarguments - プロキシインスタンスでのメソッド呼び出し時に渡される引数値を格納するオブジェクト配列。インタフェースメソッドが引数をとらない場合、null となる。プリミティブ型引数は java.lang.Integer または java.lang.Boolean のような適切なプリミティブ型ラッパークラスのインスタンスにラップされる
EventHandler
public static <T> T create(Class<T> listenerInterface,
Object target,
String action)
action を target に適用するための listenerInterface 実装を作成します。このメソッドは、その他のより一般的な create メソッドの実装と null 値をとる eventPropertyName および listenerMethodName を呼び出すことによって実装されます。
以下は、dialog.show() を使って、JDialog を表示する ActionListener を作成する例です。
EventHandler.create(ActionListener.class, dialog, "show")
listenerInterface - 作成されたプロキシを利用するリスナーインタフェースtarget - アクションを実行するオブジェクトaction - ターゲット上の書き込み可能なプロパティまたはメソッドの名前
listenerInterface を実装するオブジェクトcreate(Class, Object, String, String)
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)
public static <T> T create(Class<T> listenerInterface,
Object target,
String action,
String eventPropertyName,
String listenerMethodName)
listenerMethodName という名前のメソッドから、イベント式の値 eventPropertyName を文中の最後のメソッド action (target に適用される) に渡すための listenerInterface 実装を作成します。
eventPropertyName が null の場合、実装は、action に指定された名前のメソッドを呼び出します。EventObject を受け付けるメソッドが定義されていない場合、このアクションは EventObject または同じ名前の引数なしのメソッドをとります。
listenerMethodName が null の場合は、インタフェース内のすべてのメソッドが、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 |
|||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Copyright 2004 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。