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]]
HTML convert time: 0.005 sec.