2012年4月16日月曜日

EventHandler (Java Platform SE 6)


EventHandler (Java Platform SE 6)

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 インタフェースの新しい実装を定義し、そのインスタンスをボタンに追加します。
 //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 listenerInterface, Object target, String action)
          リスナーインタフェース内のすべてのメソッドがハンドラの actiontarget に適用するための listenerInterface 実装を作成します。
static create(Class listenerInterface, Object target, String action, String eventPropertyName)
          /** すべてのメソッドから、イベント式 eventPropertyName の値を文中の最後のメソッドである action (target に適用される) に渡すための listenerInterface 実装を作成します。
static create(Class 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.
どのように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 static  T create(Class listenerInterface,                            Object target,                            String action)
リスナーインタフェース内のすべてのメソッドがハンドラの actiontarget に適用するための listenerInterface 実装を作成します。このメソッドは、null 値をとる eventPropertyNamelistenerMethodName の両方を持つ、ほかのより一般的な実装の 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 static  T 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 static  T 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 引数の形式と同じで、最後のプロパティー名はメソッド名または書き込み可能なプロパティーを表します。


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 を実装するオブジェクト
例外:
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 も参照してください。



These are our most popular posts:

Javaプログラマであるかを見分ける10の質問 に答えてみる - 日々常々

2011年3月5日... の違いは何か? 文字列の連結は原則として+演算子を使ってはならない理由を説明 せよ。 ... 以下は説明というか、言い訳と言うか、解答欄(50文字)に書けなかった計算式 的な何か。 ... ですが論理的等価性を表すメソッドであり、多くのクラスがその内容に 依存しているため、常にtrueを返すならばそういうオブジェクトとなります。 蛇足です .... 性の向上です。テストのためにインターフェイスの抽出を行ったりします。 read more

特定の文字列で始まるか/終わるかを判定するには?[C#、VB] - @IT

2007年12月20日... 誠 EE Times EDN Japan アットマーク・アイティ ITエキスパートのための問題 解決メディア ... StartsWithメソッドを使うには、当然、文字列が代入されたString オブジェクトが必要だ。そのStringオブジェクトのStartsWithメソッドを呼び出す ... read more

Integer.toString( i ) に見る数値から文字列への変換

MIN VALUE) return 引数で渡された数値が、文字列にすると何 文字になるかを取得 int size = (i 0) ? ... size, buf); bufを文字列に変換して返す return new String(0, size, buf); } 引数で渡された数値が何文字かを判定する為の .... で、その文字数を取得するstringSizeメソッドですが、sizeTableを見ての通り、けっこう ゴリゴリです。9以下だったら1桁、99以下だっ ... i の下2桁を抽出されたことになります。 q = i / 100; して r = i - ((q 6) + (q 5) + (q 2)); すると、r は i の下2桁になる わけです。 read more

Java技術によるWebアプリケーション開発入門 1章: プロトコルと ...

Java技術によるWebアプリケーション開発入門 ... GETメソッドは本来サーバからの 情報(下り情報)を得るためのものですが、どんな情報が得たいかをサーバに伝えるため の .... GETメソッドでURLの後ろに置かれクエリ文字列の開始を示す文字は何ですか。 read more

Related Posts



0 コメント:

コメントを投稿