イベント、リスナー、およびアダプター・クラス

JavaBeans イベントは、ボタンが押されたり、ウィンドウが閉じるようなアクティビティーが起こるとシグナル通知されます。 Visual Editor for Java は、「Java Bean」ビューにイベントを表示し、 このビューを用いてイベントを追加および除去できます。

JavaBean に定義されたイベント・リストについては、『BeanInfo クラス』で説明しています。 このクラスは、一般的に使用または優先されるイベントの制御も行います。

JavaBean が生成されるときに、何かを起こしたい場合は (例えば、ボタンを押されたらデータベース更新をするなど)、 イベントを JavaBean に追加することができます。 イベントを発生させる Java Bean がソースであり、イベントが発生したときにコールバックされるオブジェクトは、リスナーと呼ばれます。 それぞれの JavaBean には、それぞれのイベントについてリスナーを追加したり、除去したりするメソッドだけでなく、 リスナーを通知することができるインターフェースがあります。

一般に、ソース JavaBean に XXX メソッドがあると、この JavaBean は XXXListener というリスナー・インターフェースと 2 つのメソッドを持っています。 XXXListener が java.util.EventListener を拡張することは重要なことです。 拡張されず、しかも特有の BeanInfo が提供されないと、イベントはディスカバーされません。

XXXListener インターフェースのメソッドそれ自体はイベントのセマンティクスに依存しますが、 規則では、メソッドのシグニチャーは void <eventOccurenceMethodName>(<EventStateObjectType> evt); となっています。XXXListener が java.util.EventObject を拡張することは重要なことです。 拡張しないで、しかも特定 BeanInfo が提供されていないと、イベントはディスカバーされません。

イベントのサンプルとして java.awt.Component JavaBean があります。 この JavaBean はマウスがこの JavaBean を上に移動するとイベントを発生させます。 リスナー・インターフェースの java.awt.event.MouseMotionListener は、次の 2 つのメソッドを実装します。

マウス・リスナーを追加する java.awt.Component には、以下の 2 つのメソッドがあります。

イベントの 2 番目のスタイルは、プロパティー値が変わるときに JavaBean により生成されます。 この例として、javax.swing.JButton での「使用可能」プロパティーがあります。 その値が変わるときにイベントを発生させるプロパティーは、バウンド・プロパティーとして知られています。 バウンド・プロパティーごとに別々のリスナー・インターフェースを持つ代わりに、 汎用リスナー・インターフェース java.beans.PropertyChangeListener を使用できます。 このインターフェースは単一のコールバック・メソッド void propertyCanged(PropertyChangeEvent evt); を持っています。引き数の PropertyChangeEvent には、メソッドの受信側が照会可能な 3 つのメソッドがあります。

ストリング getPropertyName() イベントを発生させた JavaBean 上で変更されたプロパティー名
オブジェクト getNewValue() プロパティーの新しい値
オブジェクト getOldValue() 変更前のプロパティーの値

JavaBean のプロパティー変更の候補を登録するメソッドとして、void addPropertyChangeListener(PropertyChangeListener listener); および void addPropertyChangeListener(String propertyName, PropertyChangeListener listener); という 2 つのメソッドがあります。

最初のメソッドはバウンド・プロパティーを持つ JavaBean に必ずあります。 しかし、2 番目のメソッドはオプションであり、JavaBean の作成者が使用するイベント登録のスタイルに依存します。 例えば、AWT コンポーネントはプロパティー変更登録の最初のスタイルを使用します。 一方 Swing コンポーネントは両方のスタイルを使用します。

イベントを使用するための 3 つのオブジェクトがあります。

  1. イベントを発生させる JavaBean (ソース)
  2. ソースから通知を受け取るクラス (リスナー)
  3. リスナーがコールバックされるときに発生するロジックを実装するクラス

通常、後の 2 つは結合されるので、ロジックを実行するクラスはリスナー・インターフェースを直接実装するか、 または内部クラスを使用します。 Visual Editor for Java が認識および生成するコードのスタイルは、イベント・コード生成に関するセクションで扱っています。

アダプター・クラス

多くのリスナー・インターフェースは、複数のコールバック・メソッドを持っています。 一例として、 2 つのメソッド、focusGained(java.awt.FocusEvent event) and focusLost(java.awt.FocusEvent event)、を持つ java.awt.FocusListener を挙げます。 インターフェースを実装するリスナー・クラスを作成するときに、 Java コンパイラーはインターフェース・メソッドのすべてが実装されることを強制します。 この場合、多くのメソッドでは空の状態で作成され、 1 つまたは一部のメソッドのみ実際に要件を満たす特定のコードを作成されます。 以下のステートメントで、Java Bean にフ ォーカスを当てると、いくつかのロジックの実行に使用される FocusListener を表示します。ただし、この例では空の focusLost メソッドが提供されるはずです。

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

多くのリスナーに多くの空のリスナー・メソッドを持たせることを避けるために、アダプター・クラスが提供されています。 これらのクラスにはリスナー・インターフェースが実装され、 そのメソッドには空のノーオペレーション実装を提供します。 リスナーはこれらのメソッドの拡張が可能であり、 残りのメソッドにデフォルトの実装 (これらはアダプターから継承されます) を提供するのではなく、 選択したメソッドを限定して特定化できる利点があります。

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });

Visual Editor は、アダプター・クラスを認識して処理できます。独自のイベントのアダプター・クラスを Visual Editor に関連付ける方法については、『BeanInfo イベント』セクションで説明します。

親トピック: Visual Editor を使用したイベントの処理

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.