|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.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
インタフェースの新しい実装を定義し、そのインスタンスをボタンに追加します。
次に//EventHandler の代わりに内部クラスを使用する同等のコード myButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { frame.toFront(); } });
EventHandler
の単純な利用方法として、リスナーインタフェース (通常はイベントオブジェクト) 内のメソッドの最初の引数からプロパティー値を抽出し、これを使ってターゲットオブジェクト内のプロパティー値を設定する例を紹介します。この例では、ターゲット (myButton) オブジェクトの nextFocusableComponent
プロパティーをイベントのソースプロパティーの値に設定する 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
|
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
メソッドを使用するのが一般的)。eventPropertyName
および listenerMethodName
パラメータの詳細については、 汎用的なバージョンの作成
を参照してください。
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
に関連付けられているアクションに渡します。
InvocationHandler
内の invoke
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
パラメータの詳細については、 汎用的なバージョンの作成
を参照してください。
次に、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
の値を文中の最後のメソッドである action
(target
に適用される) に渡すための listenerInterface
実装を作成します。このメソッドは、null
値をとる listenerMethodName
を持つ、より一般的な実装の create
メソッドを呼び出すことによって実装されます。action
および eventPropertyName
パラメータの詳細については、 汎用的なバージョンの作成
を参照してください。
次のコードを使って、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
を文中の最後のメソッド 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, "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
を実装するオブジェクト
NullPointerException
- listenerInterface
が null の場合
NullPointerException
- target
が null の場合
NullPointerException
- action
が null の場合EventHandler
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。