GWT のウィジェットは、他のウィジェットに自分自身を更新するか、他のアクションを実行するように通知する方法。
sinkEvent / onBrowserEvent を使用する必要がありますか? もしそうなら、カスタムイベントを作成する方法はありますか?
GWT のウィジェットは、他のウィジェットに自分自身を更新するか、他のアクションを実行するように通知する方法。
sinkEvent / onBrowserEvent を使用する必要がありますか? もしそうなら、カスタムイベントを作成する方法はありますか?
これは非常に自由形式の質問です。たとえば、ウィジェットがサブスクライブする独自の静的イベントHandlerクラスを作成できます。例えば:
Class newMessageHandler {
void update(Widget caller, Widget subscriber) {
...
}
}
customEventHandler.addEventType("New Message", newMessageHandler);
Widget w;
customEventHandler.subscribe(w, "New Message");
...
Widget caller;
// Fire "New Message" event for all widgets which have
// subscribed
customEventHandler.fireEvent(caller, "New Message");
customEventHandlerは、各名前付きイベントにサブスクライブしているすべてのウィジェットを追跡し、名前付きクラスのupdateメソッドを呼び出します。これにより、必要な追加のメソッドを呼び出すことができます。デストラクタでunsubscribeを呼び出したい場合がありますが、必要に応じて空想的にすることができます。
Observer Patternと中央のControllerを使用してこの問題を解決しました。セントラル コントローラーは、アプリケーション内のすべてのウィジェットの知識を持ち、それらを組み合わせる方法を決定する唯一のクラスです。誰かがウィジェット A で何かを変更すると、ウィジェット A はイベントを発生させます。eventhandler では、'notifyObservers()' 呼び出しを介してセントラル コントローラーを呼び出します。これは、セントラル コントローラー (およびオプションで他のものですが、簡単にするために、ここでは説明しません) に特定のアクション ('MyEvent' 列挙型インスタンスを渡す) を通知します。 )が発生しました。
このように、アプリケーション フロー ロジックは単一の中央クラスに含まれ、ウィジェットは相互参照のスパゲッティを必要としません。
これが私の(サンプル)実装です。最初に新しいイベントを作成しましょう。
import java.util.EventObject;
import com.google.gwt.user.client.ui.Widget;
public class NotificationEvent extends EventObject {
public NotificationEvent(String data) {
super(data);
}
}
次に、イベント ハンドラー インターフェイスを作成します。
import com.google.gwt.user.client.EventListener;
public interface NotificationHandler extends EventListener {
void onNotification(NotificationEvent event);
}
NotificationHanlder を実装するウィジェットがある場合は、以下を呼び出してイベントをトリガーできます。
((NotificationHandler)widget).onNotification(event);