イベント処理について

通常、イベント処理には、少なくとも3つのコードが必要です。ここでは、3つのコードをA(イベント・ソース)、B(イベント・リスナー)およびC(すべてをまとめて入れるコンテナまたは他のコード)と呼びます。

具体的には、JDeveloperでは次のようになります。

コンポーネント・エンド・ユーザーのイベントの見方

UIエディタを使用した場合、エンド・ユーザーは主としてイベントを、コンポーネントが含まれるクラスで実装する必要があるイベント処理メソッドとして認識します。たとえば、エンド・ユーザーがbutton1というボタンをFrame1というコンテナに置き、button1が押されたときに何かが起こるようにするとします。次の一連の操作が必要です。

  1. Frame1のエディタでbutton1を選択します。
  2. プロパティ・インスペクタの「イベント」ページに移動し、actionPerformedの右側をクリックします。(actionPerformedは、ボタンが押された際に生成されるイベントです。)
  3. このアクションにより、編集可能なデフォルトのアクション・リスナー名が作成されます。名前をダブルクリックして、JDeveloperに適切なメソッドを作成するよう指示し、メソッド本体に移動します。
  4. JDeveloperはFrame1ソース・ビューに切り替わり、そのイベントの発生時にコールされるイベント処理メソッドがFrame1に挿入されます。デフォルトでは、button1_actionPerformed()メソッドがコールされ、メソッド本体は最初は空のままです。
  5. 最後に、ボタンが押された場合に応答するコードをメソッドに挿入します。

内部では、JDeveloperは、イベント・リスニングの別の側面を処理する追加のコードもFrame1.javaファイルに生成します。

  1. JDeveloperは、ActionListenerインタフェースを実装するアクション・アダプタの無名の内部クラスを生成します。
  2. Frame1にクラスをインスタンス化します。
  3. 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のデフォルトのメカニズムは、次のとおりです。

  1. アダプタの無名の内部クラスを作成し、リスナー・コンポーネントとして機能させます。
  2. コンテナ・クラスを、オブジェクトがインスタンス化され、イベント・リスナー登録とイベント処理が実行されるサイトにします。

この簡単なモデルでは、ユーザーがコンポーネント・パレットから選択するコンポーネントは、イベント・ソースであればよく、イベント・リスナーである必要はありません。

標準アダプタ・クラスの使用

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では、無名の内部クラスを使用してコードが生成されています。アダプタを使用するどちらの方法も、アクションが実行されたイベントを処理するコードですが、匿名アダプタのアプローチの方が簡潔です。

標準アダプタをプロジェクトのデフォルトにするには、次のようにします。

  1. メイン・メニューから「ツール」->「設定」を選択します。
  2. 「コード・スタイル」ノードを選択します。
  3. 「コード・スタイル」ページで、イベント処理オプションとして「標準アダプタ」を選択します。
  4. 「OK」をクリックします。

これによってJDeveloperでは、イベント用に(無名の内部クラスではなく)標準アダプタが生成されるようになります。

コンポーネントの作成者のイベントの見方

Beanを開発する際は、Beanが生成する必要のあるすべてのイベントを考慮する必要があります。

コンポーネントでイベントを起動できるようにするには、次のようにします。

  1. 起動する必要のあるイベントの種類を判断し、次のどちらかを実行します。
  2. 該当する既存のイベント・セットをAWTまたはJFCから選択

    または

    新規イベント・セットを作成

  3. コンポーネント用のイベント登録メソッドを作成します。
  4. そのイベント用のイベント通知または伝播メカニズムを作成します。

    fire<yourEventName>Event()

  5. イベントの送信先となるBean内のキー・ポイントから、そのイベント発生をコールし、イベント通知メカニズムをコールします。

JavaBeansの開発
クラス・エディタを使用したイベントの作成および変更
JavaBeansのイベントのチューニング

JavaBeansについて
JavaBeansのイベントについて
JavaBeansのイベント・セットについて