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