2008-09-17 40 views
1

GWT中的小工具應該如何通知其他小工具刷新自己或執行其他操作。通知其他小工具的小工具

我應該使用sinkEvent/onBrowserEvent嗎? 如果有,是否有創建自定義事件的方法?

回答

3

我已使用Observer Pattern和中心Controller解決了此問題。中央控制器是唯一具有應用程序中所有小部件的知識並確定它們組合在一起的方法。如果某人改變了窗口小部件A上的某些內容,窗口小部件A將觸發一個事件在事件處理程序中,您可以通過'notifyObservers()'調用中央控制器來調用中央控制器,該中央控制器可以爲中央控制器提供信息(也可能包括其他控件,但爲了簡單起見,我不打算進行這種調用)某個動作(傳遞'MyEvent'枚舉實例) 已經發生了。

這樣,應用程序流程邏輯包含在一箇中心類中,並且小部件不需要引用彼此的意大利式麪條。

+0

你和我一樣來到了同樣的解決方案。首先嚐試sendNotification,recieveNotification機制會變得複雜得多。觀察者模式非常合適,中央控制器更有意義。 – Drejc 2008-09-18 08:26:06

3

這是一個非常開放的問題 - 例如,您可以創建自己的靜態事件Handler類,這些類都是小部件自訂的。 e.g:

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跟蹤訂閱每個命名事件的所有部件,並呼籲命名的類,然後可以調用任何你想要的其他方法的更新方法。您可能想要在析構函數中調用退訂 - 但您可以按照自己的喜好進行設置。

+0

這可能適用於我的想法,一定會試一試。 – Drejc 2008-09-17 21:09:49

1

因此,這裏是我的(樣本)實施, 首先讓我們創建一個新的事件:

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

如果我們現在有實現一個widget NotificationHanlder,我們可以通過撥打 觸發事件:

((NotificationHandler)widget).onNotification(event);