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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

アダプター・クラス

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

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

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

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

フィードバック