必要なもの:
1. イベントを発生させるコンポーネント
2. カスタム イベント クラス
3. リスナー インターフェイス
4. リスナーの実装
1 からのコンポーネントには、イベント リスナーとメソッドのリストが必要addListener
です。removeListener
; とdispatchEvent
。-method は、dispatchEvent
イベント リスナーのリストを繰り返し処理し、何らかのメソッドを実行します (4: リスナーの実装を参照)。そのメソッドは引数としてイベント オブジェクトを持っています (2: カスタム イベント クラスを参照)。
1 の必須コード:
protected List<MyListener> listeners;
protected synchronized void dispatchEvent(MyEvent event) {
if (listeners != null) {
for (MyListener listener : listeners) {
listener.myMethod(event);
}
}
}
public synchronized void addListener(MyListener listener) {
if (listeners == null) {
listeners = new ArrayList<MenuListener>();
}
listeners.add(listener);
}
public synchronized void removeListener(MyListener listener) {
if (listeners == null) {
listeners = new ArrayList<MyListener>();
return;
}
listeners.remove(listener);
}
2 の必須コード:
public class MyEvent {
protected String eventType;
public MyEvent(String eventType) {
this.eventType = eventType;
}
//getters and setters
}
3の必須部分:
public interface MyListener {
public void doSomething(MyEvent event);
}
4 のコード (リスナーの実装)
public class MyImplementation implements MyListener {
@Override
public void doSomething(myEvent event) {
//do something concretes here
}
}
コード フローのしくみ:
ディスパッチャー クラスは、何らかのやり取りの後、すべてのイベント リスナーに何かが発生したことを「アナウンス」します。
dispatchEvent(new MyEvent("ADD_USER"));
イベントを受け取りたいクラスでは、ディスパッチャー クラスとリスナー実装クラスをインスタンス化し、リスナーをディスパッチャーのリストに追加する必要があります。
MyDispatcher disp = new MyDispatcher();
MyImplementation myImpl = new MyImplementation();
// Then add the event-listener to the dispatcher:
disp.addListener(myImpl);
確かに、これらのクラスの一部は内部クラスにすることができ、コードは単純化または拡張できますが、これは一般的な考え方です。これも単純な Java であり、Vaadin に依存するものは何もありません。