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

+イベントオブジェクト
+イベントオブジェクトを発信するオブジェクト
+イベントオブジェクトを受信するオブジェクト

が必要。イベントオブジェクトは 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|Diff|History|Attach|Copy|Rename|
HTML convert time: 0.001 sec.