public class EventHandler extends Object implements InvocationHandler
EventHandler
クラスは、受信イベントオブジェクトとターゲットオブジェクトを含んだ単純な文を実行するメソッドを持つ、イベントリスナーの動的生成をサポートします。
EventHandler
クラスは、開発者が Bean 間の接続を確立するために使用する、アプリケーションビルダーのような対話型ツールで使用されます。通常、接続は、ユーザーインタフェース Bean (イベントソース) からアプリケーションロジック Bean (ターゲット) に向けて確立されます。そのなかでも、ユーザーインタフェースからアプリケーションロジックを隔離するような接続は特に効果的です。たとえば、JCheckBox
とブール値を受け付けるメソッドを接続する EventHandler
は、チェックボックスの状態を抽出し、これを直接メソッドに渡すことによって、メソッドをユーザーインタフェース層から隔離することができます。
ユーザーインタフェースを使ったイベントの処理方法としてより一般的なのは、内部クラスを使用する方法です。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(); } });
EventHandler
の単純な利用方法として、リスナーインタフェース (通常はイベントオブジェクト) 内のメソッドの最初の引数からプロパティー値を抽出し、これを使ってターゲットオブジェクト内のプロパティー値を設定する例を紹介します。この例では、ターゲット (myButton) オブジェクトの nextFocusableComponent
プロパティーをイベントの source プロパティーの値に設定する ActionListener
を作成します。
これは、次の内部クラス実装に対応しています。EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")
受信イベントオブジェクトをターゲットアクションに渡すだけの//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent e) { myButton.setNextFocusableComponent((Component)e.getSource()); } }
EventHandler
を作成することもできます。4 番目の EventHandler.create
引数が空の文字列である場合、次のようにしてイベントが渡されます。
これは、次の内部クラス実装に対応しています。EventHandler.create(ActionListener.class, target, "doActionEvent", "")
イベントオブジェクトのソースからプロパティー値を抽出し、この値をターゲットオブジェクトのプロパティー値として設定するというのが、おそらくもっとも一般的な//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent e) { target.doActionEvent(e); } }
EventHandler
の利用方法でしょう。次の例では、ターゲットオブジェクトの label プロパティーをイベントのソースの text プロパティーの値 (source プロパティーの値) に設定する ActionListener
を作成します。
これは、次の内部クラス実装に対応しています。EventHandler.create(ActionListener.class, myButton, "label", "source.text")
イベントプロパティーは、ピリオド (.) で区切られた任意の数のプロパティー接頭辞によって修飾されます。ピリオドの前に表示される完全指定名は、イベントオブジェクトに適用されるプロパティー (左から順に適用) の名前として扱われます。//Equivalent code using an inner class instead of EventHandler. new ActionListener { public void actionPerformed(ActionEvent e) { myButton.setLabel(((JTextField)e.getSource()).getText()); } }
たとえば、次のようなアクションリスナーがあります。
このアクションリスナーは、次の内部クラスとして書き込まれます (すべてのプロパティーが正規の取得メソッドを持ち、適切な型を返すものと想定)。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()); } }
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.getA().setB(e.getC().isD()); } }
EventHandler
はメソッドを呼び出す際に最終的にリフレクションに依存するため、オーバーロードされたメソッドをターゲットにしないことをお勧めします。たとえば、ターゲットが次のように定義された MyTarget
クラスのインスタンスであるとします。
public class MyTarget { public void doIt(String); public void doIt(Object); }これで
doIt
メソッドはオーバーロードされます。EventHandler はソースに基づいて適切なメソッドを呼び出します。ソースが null の場合は、どちらのメソッドも適しているため、呼び出されるメソッドは不定です。そのため、オーバーロードされたメソッドをターゲットにしないことをお勧めします。Proxy
, EventObject
コンストラクタと説明 |
---|
EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
新しい
EventHandler オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく、いずれかの create メソッドを使用するのが一般的)。 |
修飾子と型 | メソッドと説明 |
---|---|
static <T> T |
create(Class<T> listenerInterface, Object target, String action)
リスナーインタフェース内のすべてのメソッドがハンドラの
action を target に適用するような listenerInterface 実装を作成します。 |
static <T> T |
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName)
/** すべてのメソッドが、イベント式
eventPropertyName の値を文中の final メソッドである action (target に適用される) に渡すような listenerInterface 実装を作成します。 |
static <T> T |
create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
listenerMethodName という名前のメソッドが、イベント式 eventPropertyName の値を文中の final メソッドである action (target に適用される) に渡すような listenerInterface 実装を作成します。 |
String |
getAction()
このイベントハンドラによって設定されるターゲットの書き込み可能なプロパティー、またはこのイベントがターゲット上で呼び出すメソッドの名前を返します。
|
String |
getEventPropertyName()
ターゲットに適用されるアクションで使用されるイベントのプロパティーを返します。
|
String |
getListenerMethodName()
アクションをトリガーするメソッドの名前を返します。
|
Object |
getTarget()
このイベントハンドラがメッセージの送信先とするオブジェクトを返します。
|
Object |
invoke(Object proxy, Method method, Object[] arguments)
イベントから適切なプロパティー値を抽出し、この
EventHandler に関連付けられているアクションに渡します。 |
@ConstructorProperties(value={"target","action","eventPropertyName","listenerMethodName"}) public EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName)
EventHandler
オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく、いずれかの create
メソッドを使用するのが一般的)。eventPropertyName
および listenerMethodName
パラメータの詳細は、the general version of create
を参照してください。target
- アクションを実行するオブジェクトaction
- ターゲット上の (修飾されている可能性がある) プロパティーまたはメソッドの名前eventPropertyName
- 受信イベントの読み取り可能なプロパティーの (修飾されている可能性がある) 名前listenerMethodName
- アクションをトリガーするべきリスナーインタフェース内のメソッドの名前NullPointerException
- target
が null である場合NullPointerException
- action
が null である場合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
に関連付けられているアクションに渡します。invoke
、インタフェース: InvocationHandler
proxy
- プロキシオブジェクト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
実装を作成します。このメソッドは、null
値をとる eventPropertyName
と listenerMethodName
の両方を持つ、ほかのより一般的な実装の create
メソッドを呼び出すことによって実装されます。action
パラメータの詳細は、the general version of create
を参照してください。
次に、dialog.show()
を使って、JDialog
を表示する ActionListener
を作成する例を示します。
EventHandler.create(ActionListener.class, dialog, "show")
listenerInterface
- プロキシの作成対象となるリスナーインタフェースtarget
- アクションを実行するオブジェクトaction
- ターゲット上の (修飾されている可能性がある) プロパティーまたはメソッドの名前listenerInterface
を実装するオブジェクトNullPointerException
- listenerInterface
が null である場合NullPointerException
- target
が null である場合NullPointerException
- action
が null である場合create(Class, Object, String, String)
public static <T> T create(Class<T> listenerInterface, Object target, String action, String eventPropertyName)
eventPropertyName
の値を文中の final メソッドである action
(target
に適用される) に渡すような listenerInterface
実装を作成します。このメソッドは、null
値をとる listenerMethodName
を持つ、より一般的な実装の create
メソッドを呼び出すことによって実装されます。action
および eventPropertyName
パラメータの詳細は、the general version of create
を参照してください。
次のコードを使って、JLabel
のテキストを受信イベントの JTextField
ソースのテキスト値に設定する ActionListener
を作成できます。
これは次のコードと等価です。EventHandler.create(ActionListener.class, label, "text", "source.text");
//Equivalent code using an inner class instead of EventHandler. new ActionListener() { public void actionPerformed(ActionEvent event) { label.setText(((JTextField)(event.getSource())).getText()); } };
listenerInterface
- プロキシの作成対象となるリスナーインタフェースtarget
- アクションを実行するオブジェクトaction
- ターゲット上の (修飾されている可能性がある) プロパティーまたはメソッドの名前eventPropertyName
- 受信イベントの読み取り可能なプロパティーの (修飾されている可能性がある) 名前listenerInterface
を実装するオブジェクトNullPointerException
- listenerInterface
が null である場合NullPointerException
- target
が null である場合NullPointerException
- action
が null である場合create(Class, Object, String, String, String)
public static <T> T create(Class<T> listenerInterface, Object target, String action, String eventPropertyName, String listenerMethodName)
listenerMethodName
という名前のメソッドが、イベント式 eventPropertyName
の値を文中の final メソッドである action
(target
に適用される) に渡すような listenerInterface
実装を作成します。その他のリスナーメソッドは、何も処理を行いません。
eventPropertyName
文字列は、ターゲットメソッドに渡される受信イベントオブジェクトから値を抽出するために使用されます。一般に、ターゲットメソッドは引数を取らないため、eventPropertyName
で null 値を使用するようにしてください。また、受信イベントオブジェクトをターゲットメソッドに直接渡すには、空の文字列を使用します。eventPropertyName
文字列の形式は、メソッドまたはプロパティーのシーケンスです。それぞれのメソッドやプロパティーは、受信イベントオブジェクトから開始された先行メソッドによって返される値に対して適用されます。構文は次のとおりです。propertyName{.propertyName}*
ここで propertyName
はメソッドまたはプロパティーに一致します。たとえば point
プロパティーを MouseEvent
から抽出するには、"point"
または "getPoint"
を eventPropertyName
として使用できます。「text」プロパティーを JLabel
ソースを持つ MouseEvent
から抽出するには、"source.text"
、"getSource.text"
、"getSource.getText"
、または "source.getText"
のいずれかを eventPropertyName
として使用します。メソッドが見つからない場合、またはメソッドの呼び出しで例外が生成された場合は、ディスパッチ時に RuntimeException
がスローされます。たとえば受信イベントオブジェクトが null で、eventPropertyName
が null でも空でもない場合は、RuntimeException
がスローされます。
action
引数の形式は eventPropertyName
引数の形式と同じで、最後のプロパティー名はメソッド名または書き込み可能なプロパティーを表します。
listenerMethodName
が null
の場合は、インタフェース内のすべてのメソッドが、target
上で実行される action
をトリガーします。
たとえば、マウスボタンを押すたびにターゲットオブジェクトの origin
プロパティーを受信する MouseEvent
の場所 (mouseEvent.getPoint()
の値) に設定する MouseListener
を作成したい場合は、次のように記述します。
これは、EventHandler.create(MouseListener.class, target, "origin", "point", "mousePressed");
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
を実装するオブジェクトNullPointerException
- listenerInterface
が null である場合NullPointerException
- target
が null である場合NullPointerException
- action
が null である場合EventHandler
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.