EventHandler (Java Platform SE 6)
java.beans
クラス EventHandler
java.lang.Object java.beans.EventHandler
- すべての実装されたインタフェース:
- InvocationHandler
public class EventHandler
- extends Object
- implements InvocationHandler
- extends Object
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 の場合は、どちらのメソッドも適しているため、呼び出されるメソッドは不定です。そのため、オーバーロードされたメソッドをターゲットにしないことをお勧めします。 - 導入されたバージョン:
- 1.4
- 関連項目:
Proxy
,EventObject
コンストラクタの概要 | |
---|---|
EventHandler(Object target, String action, String eventPropertyName, String listenerMethodName) 新しい EventHandler オブジェクトを作成します (このコンストラクタを直接呼び出すのではなく create メソッドを使用するのが一般的)。 |
メソッドの概要 | |
---|---|
static | create(Class リスナーインタフェース内のすべてのメソッドがハンドラの action を target に適用するための listenerInterface 実装を作成します。 |
static | create(Class /** すべてのメソッドから、イベント式 eventPropertyName の値を文中の最後のメソッドである action (target に適用される) に渡すための listenerInterface 実装を作成します。 |
static | create(Class /** listenerMethodName という名前のメソッドから、イベント式の値 eventPropertyName を文中の最後のメソッド action (target に適用される) に渡すための listenerInterface 実装を作成します。 |
String | getAction() このイベントハンドラによって設定されるターゲットの書き込み可能なプロパティー、またはこのイベントがターゲット上で呼び出すメソッドの名前を返します。 |
String | getEventPropertyName() ターゲットに適用されるアクションで使用されるイベントのプロパティーを返します。 |
String | getListenerMethodName() アクションをトリガーするメソッドの名前を返します。 |
Object | getTarget() このイベントハンドラがメッセージの送信先とするオブジェクトを返します。 |
Object | invoke(Object proxy, Method method, Object[] arguments) イベントから適切なプロパティー値を抽出し、この EventHandler に関連付けられているアクションに渡します。 |
クラス java.lang.どのようにhtmlで検索ページを作成する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
メソッドを使用するのが一般的)。eventPropertyName
およびlistenerMethodName
パラメータの詳細については、汎用的なバージョンの作成
を参照してください。- パラメータ:
target
- アクションを実行するオブジェクトaction
- ターゲット上の (修飾されている可能性がある) プロパティーまたはメソッドの名前eventPropertyName
- 受信イベントの読み込み可能なプロパティーの (修飾されている可能性がある) 名前listenerMethodName
- アクションをトリガーするリスナーインタフェース内のメソッドの名前- 例外:
NullPointerException
-target
が null の場合NullPointerException
-action
が null の場合- 関連項目:
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 staticT create(Class 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)
create
public staticT create(Class 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)
create
public staticT create(Class 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
バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。
0 コメント:
コメントを投稿