質問
GWT のウィジェットは、他のウィジェットに自身を更新するか、他のアクションを実行するようにどのように通知する必要があります。
SinkEvent / onBrowserEvent を使用する必要がありますか?もしそうなら、カスタムイベントを作成する方法はありますか?
解決
私はを使用してこの問題を解決しました オブザーバーパターン そして中央 コントローラ. 。中央コントローラーは、アプリケーション内のすべてのウィジェットについての知識を持ち、ウィジェットを組み合わせる方法を決定する唯一のクラスです。誰かがウィジェット A で何かを変更すると、ウィジェット A はイベントを起動します。イベントハンドラーでは、「notifyObservers()」呼び出しを通じて中央コントローラーを呼び出します。これにより、中央コントローラー (および必要に応じて他のコントローラーも、ただし簡略化のためここでは触れません) に特定のアクション (「MyEvent」列挙型インスタンスを渡す) が通知されます。 )が発生しました。
このようにして、アプリケーション フロー ロジックは単一の中央クラスに含まれ、ウィジェットは相互参照のスパゲッティを必要としません。
他のヒント
これは非常に自由度の高い質問です。たとえば、ウィジェット自体がサブスクライブする独自の静的イベント ハンドラー クラスを作成することもできます。例えば:
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 を呼び出すこともできますが、必要に応じて派手にすることもできます。
それで、ここに私の(サンプル)の実装があります。まず新しいイベントを作成しましょう。
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);