2003年11月12日

Javaのイベント

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);

Posted by reddog at 2003年11月12日 12:58 | プログラム