2008-09-17 9 views
1

GWTのウィジェットは、他のウィジェットに自分自身をリフレッシュしたり、他のアクションを実行するように通知する必要があります。他のウィジェットに通知するウィジェット

sinkEvent/onBrowserEventを使用する必要がありますか? カスタムイベントを作成する方法はありますか?

答えて

3

Observer Patternと中央Controllerを使用してこの問題を解決しました。中央コントローラーは、アプリケーション内のすべてのウィジェットの知識を持ち、一緒にフィットする方法を決定する唯一のクラスです。誰かがウィジェットAで何かを変更した場合、ウィジェットAはイベントを発生させます。イベントハンドラーでは、 'notifyObservers()'コールを使用して中央コントローラーを呼び出します。これは、中央コントローラー(およびオプションで他のものですが、単純化するために、 )が発生した。

このように、アプリケーションフローロジックは単一のセントラルクラスに含まれており、ウィジェットは互いに参照のスパゲッティを必要としません。だからここ

+0

あなたは私と同じ解決策に来ました。最初にsendNotification、recieveNotificationメカニズムを試してみると、非常に複雑になります。オブザーバーのパターンは完璧にフィットし、中央コントローラーはより理にかなっています。 – Drejc

3

これは非常に未解決の質問です。たとえば、ウィジェットが自分自身を登録する独自の静的イベントHandlerクラスを作成できます。例えば:customEventHandlerは各名前付きイベントをサブスクライブするすべてのウィジェットを追跡し、その後、あなたが望む任意の追加のメソッドを呼び出すことができますという名前のクラス、でupdateメソッドを呼び出します

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

。デストラクタでunsubscribeを呼び出すこともできますが、必要に応じてファンシーにすることもできます。

+0

これは私が心に留めていることのために働くかもしれません、確かに試してみましょう。 – Drejc

1

は私の(サンプル)の実装、 である第一のは、新しいイベントを作成してみましょう:私たちは今、実装ウィジェットを持っている場合

import com.google.gwt.user.client.EventListener; 

public interface NotificationHandler extends EventListener { 
    void onNotification(NotificationEvent event); 
} 

import java.util.EventObject; 
import com.google.gwt.user.client.ui.Widget; 

public class NotificationEvent extends EventObject { 
    public NotificationEvent(String data) { 
     super(data); 
    } 
} 

はその後、我々は、イベントハンドラ・インタフェースを作成します通知ハンター、我々は 呼び出すことによってイベントをトリガーすることができます:

((NotificationHandler)widget).onNotification(event); 
関連する問題