javaのイベントについて調べたので、忘れないようにTipsをまとめました。 イベントオブジェクトとそれを送信するオブジェクトと、受信するオブジェクトが存在している場合についてのみです。NetBeansだとイベントオブジェクトは自分で書かないといかんのですが、送信、受信の実装はウィザードみたいなのでお手軽にできるので便利でした。

  1. イベントオブジェクト
  2. イベントオブジェクトを発信するオブジェクト
  3. イベントオブジェクトを受信するオブジェクト

が必要。イベントオブジェクトは java.util.EventObjectを継承して独自のものを作ることが出来る。簡単に書けば次のように。実際はもっと多くの情報をもたせたりすることも出来る。

public class HogeEvent extends java.util.EventObject {
   HogeEvent(java.awt.Component source) {
       super(source);
   }   
}

それから次に、イベントを受信するオブジェクトのインターフェースを決めておく。setHogeというのは、イベントが起きたときに実行されるハンドラー。

interface HogeListener extends java.util.EventListener {
   void setHoge(HogeEvent evt);
}

次にイベントを発生させるオブジェクトを作る。上のリスナーインターフェースを実装したオブジェクトを登録、削除する機能と登録されたリスナーにイベントを通知する機能の3つを実装する 必要がある。次の例はJPanelを拡張したもの。(長くなるので、コンストラクタとかその他のコンポーネントの初期化処理とかは省略しました)。setHogeのトリガーを引くには新しくHogeEventオブジェクトを作成して、それを引数にしてfireHogeListenerSetHogeを呼べばよい。

public class Keisan extends JPanel {
   private javax.swing.event.EventListenerList listenerList =  null;
   
   /** イベントを受け取るために HogeListener を登録します。 */
   public synchronized void addHogeListener(HogeListener listener) {
       if (listenerList == null ) {
           listenerList = new javax.swing.event.EventListenerList();
       }
       listenerList.add(HogeListener.class, listener);
   }
   
   /** リスナーのリストから HogeListener を削除します。 */
   public synchronized void removeHogeListener(HogeListener listener) {
       listenerList.remove(HogeListener.class, listener);
   }    
   
   /** すべての登録リスナーにイベントを通知。 */
   private void fireHogeListenerSetHoge(HogeEvent event) {
       if (listenerList == null) return;
       Object[] listeners = listenerList.getListenerList();
       for (int i = listeners.length-2; i>=0; i-=2) {
           if (listeners[i]==HogeListener.class) {
               ((HogeListener)listeners[i+1]).setHoge(event);
           }
       }
   }
}

次に受信するオブジェクトのクラスを作る。これは先のリスナーインターフェースを実装するだけ。インターフェースで実装しなければいけないメソッドが多いとき、適当に先に作っておいて継承させるAdapterというやり方もあるみたいだが、Javaは多重継承できないので全部実装する。 (この例もインターフェースを実装した部分だけ抜き出しました)

public class Kekka extends JPanel implements HogeListener{
   public void setHoge(HogeEvent HogeEvent) {
       jLabel1.setText("イベントを受け取りました");
   }
}

で、最後に受信するオブジェクト(リスナー)をイベントを発生させるオブジェクトに登録すればOK。

   Kekka kekka = new Kekka();
   Keisan keisan = new Keisan();
   Keisan.addHogeListener(kekka);

CategoryJava


|New|Edit|Freeze|Diff|History|Attach|Copy|Rename|
Last-modified: 2004-07-28 (Wed) 00:00:00
HTML convert time: 0.008 sec.