通常、イベント処理には、少なくとも3つのコードが必要です。ここでは、3つのコードをA(イベント・ソース)、B(イベント・リスナー)およびC(すべてをまとめて入れるコンテナまたは他のコード)と呼びます。
ソース・コンポーネントでは、イベントが生成されます。他のコンポーネントがこのイベントの通知を受けるために使用できる、イベント登録メソッド(add<Event>Listener
メソッドとremove<Event>Listener
メソッド)を提供します。
これは、イベント・リスナー・インタフェースを実装するコンポーネントで、リスナー追加コールを使用してAに登録されます。理論上は、イベント・リスナー・インタフェースを実装するコンポーネントであれば、いずれもイベント・リスニング・コンポーネントということになりますが、通常は、あるプログラムの特定のイベントを処理するために作成されるプライベートの匿名クラスを指します。
コード内で、AとBがインスタンス化され、add<Event>Listener
メソッドがコールされます。
具体的には、JDeveloperでは次のようになります。
JDeveloperのUIエディタにより、アクション・アダプタ・クラスが自動的に生成され、Cが定義されている .java
ファイルに置かれます。JDeveloperでは、イベントを受け取り、経路を決めるアクション・アダプタが生成されます。アクション・アダプタは、イベント処理を、Cに実装されているターゲット・イベント処理メソッドに委任します。イベント処理メソッドは、ユーザーがイベントに応答するコードを記述する場所です。通常、ユーザーは、アクション・アダプタでは何も行いません。
java.awt.Container
の子です。
JDeveloperは、コンテナCでイベント・リスナー・インタフェースを直接実装せず、アクション・アダプタのかわりにC自体をイベント・リスナーとして登録します。JDeveloperは、アクション・アダプタのアプローチを使用して、ある特定のイベントが複数のコンポーネントによって生成される場合の混乱を避けます。アクション・アダプタのアプローチを使用しない場合、イベント・ハンドラでは、どのコンポーネントでイベントが生成されたかを判断しないと、イベントを適切に処理できません。アクション・アダプタのアプローチを使用した場合、各アダプタが、さらには各イベント処理メソッドが、1組のソースとリスナーとして表されます。
UIエディタを使用した場合、エンド・ユーザーは主としてイベントを、コンポーネントが含まれるクラスで実装する必要があるイベント処理メソッドとして認識します。たとえば、エンド・ユーザーがbutton1というボタンをFrame1というコンテナに置き、button1が押されたときに何かが起こるようにするとします。次の一連の操作が必要です。
actionPerformed
の右側をクリックします。(actionPerformed
は、ボタンが押された際に生成されるイベントです。)button1_actionPerformed()
メソッドがコールされ、メソッド本体は最初は空のままです。 内部では、JDeveloperは、イベント・リスニングの別の側面を処理する追加のコードもFrame1.java
ファイルに生成します。
ActionListener
インタフェースを実装するアクション・アダプタの無名の内部クラスを生成します。button1.addActionListener()
をコールすることにより、自身をbutton1イベントのリスナーとして登録します。このコードはすべてソース・ビューに表示されますが、開発者は、主にイベント発生時にアクション・アダプタによってコールされるイベント処理メソッドを記述します。
JDeveloperによりデフォルトで生成される特定のタイプの内部クラス・イベント・アダプタは、匿名アダプタと呼ばれます。このスタイルのアダプタでは、個別の(名前付き)アダプタ・クラスが作成されません。そのため、コードは簡潔かつ的確です。
プロジェクトのプロパティ・ダイアログの「コード・スタイル」ページで目的のオプションを選択することにより、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では、無名の内部クラスを使用してコードが生成されています。アダプタを使用するどちらの方法も、アクションが実行されたイベントを処理するコードですが、匿名アダプタのアプローチの方が簡潔です。
標準アダプタをプロジェクトのデフォルトにするには、次のようにします。
これによってJDeveloperでは、イベント用に(無名の内部クラスではなく)標準アダプタが生成されるようになります。
Beanを開発する際は、Beanが生成する必要のあるすべてのイベントを考慮する必要があります。
コンポーネントでイベントを起動できるようにするには、次のようにします。
該当する既存のイベント・セットをAWTまたはJFCから選択
または
新規イベント・セットを作成
fire<yourEventName>Event()