通常、イベント処理には、少なくとも3つのコードが関与します。ここでは、3つのコードをA(イベント・ソース)、B(イベント・リスナー)およびC(すべてをまとめて入れるコンテナまたはその他のコード)と呼びます。
ソース・コンポーネントでは、イベントが生成されます。他のコンポーネントがこのイベントの通知を受け取るために使用できる、イベント登録メソッド(add<Event>Listener
メソッドとremove<Event>Listener
メソッド)を提供します。
これは、イベント・リスナー・インタフェースを実装するコンポーネントで、リスナー追加コールを使用してAに登録されます。理論上は、イベント・リスナー・インタフェースを実装するコンポーネントですが、通常は、あるプログラムの特定のイベントを処理するために作成されるprivateの匿名クラスを指します。
コード内で、AとBがインスタンス化され、add<Event>Listener
メソッドがコールされます。
具体的に、JDeveloperでは次のようになります。
JDeveloperのJavaビジュアル・エディタにより、アクション・アダプタ・クラスが自動的に生成され、Cが定義されているのと同じ .java
ファイルに置かれます。JDeveloperでは、イベントを受け取り、ルートを指定するアクション・アダプタが生成されます。アクション・アダプタは、イベント処理を、Cに実装されているターゲット・イベント処理メソッドに委任します。ユーザーはイベント処理メソッドでイベントに応答するコードを記述します。一般的に、ユーザーはアクション・アダプタでは何も行いません。
java.awt.Container
の子です。
JDeveloperは、コンテナCでイベント・リスナー・インタフェースを直接実装せず、アクション・アダプタのかわりにC自体をイベント・リスナーとして登録します。JDeveloperは、アクション・アダプタのアプローチに依存して、ある特定のイベントが複数のコンポーネントによって作成される場合の混乱を回避します。このアプローチを使用しない場合、イベント・ハンドラでは、イベントを適切に処理するためにどのコンポーネントでイベントが生成されたかを判断する必要が生じます。アクション・アダプタのアプローチを採用した場合、各アダプタ、さらに各イベント処理メソッドが、1組のソース/リスナーのペアとして表されます。
Javaビジュアル・エディタを使用した場合、エンド・ユーザーは主にイベントを、コンポーネントが含まれるクラスで実装する必要があるイベント処理メソッドとして認識します。たとえば、エンド・ユーザーが、button1というボタンをFrame1というコンテナに置き、button1が押されたときに何かが起こるようにするとします。次の一連のアクションの発生が必要です。
actionPerformed
の右側をクリックします(actionPerformed
は、ボタンが押されたときに生成されるイベントです)。
button1_actionPerformed()
メソッドがコールされ、メソッドの本体は最初は空です。
バックグラウンドでは、次のようにしてイベント・リスニングの他の側面を処理する追加のコードがFrame1.java
ファイルに生成されます。
ActionListener
インタフェースを実装するアクション・アダプタの匿名の内部クラスを生成します。
button1.addActionListener()
をコールすることにより、自分自身をbutton1イベントのリスナーとして登録します。
このコードはすべてソース・ビューに表示されますが、開発者の主な任務は、イベント発生時にアクション・アダプタによってコールされるイベント処理メソッドを記述することです。
JDeveloperによりデフォルトで生成される特定のタイプの内部クラス・イベント・アダプタは、匿名アダプタと呼ばれます。このスタイルのアダプタは、別個の(名前付き)アダプタ・クラスを作成しません。その結果、コードは簡潔かつ的確です。
「設定」ダイアログの「Javaビジュアル・エディタ」ページから必要なオプションを選択することにより、JDeveloperでのアダプタ・クラスの生成方法を制御できます。詳細は、「標準アダプタ・クラスの使用」を参照してください。
たとえば、次のコードは、匿名アダプタを使用して、アクションが実行されたイベント用に生成されたものです。
button1.addActionListener(new java.awt.event.ActionAdapter() {
public void actionPerformed(ActionEvent e) {
button1_actionPerformed(e);
}
});
void button1_actionPerformed(ActionEvent e) {
// your code to respond to event goes here
}
エンド・ユーザーは、プロパティ・インスペクタの「イベント」ページにリストされている、button1から発生する可能性のあるイベントをすべて参照できます。コンポーネントの作成者は、コンポーネント・クラスを、そのクラスで生成されるすべてのイベントがプロパティ・インスペクタに表示されるように作成する必要があります。エンド・ユーザーは、イベント処理メソッドのコードを記述するだけでBeanを使用できます。
上級のユーザーは、別の方法でイベントを結び付けます。たとえば、コンポーネントsrcがイベント・ソースで、コンポーネントlstnrがイベント・リスナーであり、クラスinit
でsrcとlstnrがインスタンス化されている場合、ユーザーはsrc.addListener(b)
をコールするコードをクラスinit
に挿入できます。
JDeveloperのデフォルトのメカニズムは、次のとおりです。
この単純なモデルでは、ユーザーがコンポーネント・パレットから選択するコンポーネントはイベント・ソースであればよく、イベント・リスナーである必要はありません。
JDeveloperでは、内部クラスのかわりに、標準のクラス・イベント・アダプタも生成できます。
標準イベント・アダプタは、宣言されたスコープ内のすべての変数にアクセスできる匿名アダプタとは異なり、パブリックまたはパッケージ・レベルでのみアクセスできます。
たとえば、次のコードは、標準クラスを使用して、アクションが実行されたイベント用に生成されたものです。
// Registers the adapter as a listener to button1.
button1.addActionListener(new Frame1_button1_actionAdapter(this));
...
// Adapter class definition.
class Frame1_button1_actionAdapter extends java.awt.event.ActionAdapter {
Frame 1 adaptee;
Frame1_button1_actionAdapter(Frame1 adaptee) {
this.adaptee = adaptee;
}
public void actionPerformed(ActionEvent e) {
adaptee.button1_actionPerformed(e);
}
}
void button1_actionPerformed(ActionEvent e) {
// code to respond to event goes here
}
このコードを、前述のコード・サンプルと比較してください。JDeveloperでは、匿名の内部クラスを使用してコードが生成されています。アダプタを使用するどちらの方法でも、アクションが実行されたイベントを処理するコードが生成されますが、匿名アダプタを使用した方が簡潔です。
標準アダプタをプロジェクトのデフォルトにするには、次のようにします。
これで、イベント用に標準アダプタが(匿名の内部クラスではなく)生成されます。
Beanを開発する場合、Beanが生成する必要のあるすべてのイベントについて考慮する必要があります。
コンポーネントでイベントを起動できるようにするには、次のようにします。
該当する既存のイベント・セットをAWTまたはJFCから選択します。
または
新規イベント・セットを作成します。
fire<yourEventName>Event()
Copyright © 1997, 2004, Oracle. All rights reserved.