窗口小部件通知其他窗口小部件

时间:2008-09-17 13:22:19

标签: gwt

GWT中的窗口小部件应该如何通知其他窗口小部件刷新自己或执行其他操作。

我应该使用sinkEvent / onBrowserEvent吗? 如果有,有办法创建自定义事件吗?

3 个答案:

答案 0 :(得分: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跟踪订阅每个命名事件的所有窗口小部件,并在命名类上调用update方法,然后可以调用所需的任何其他方法。你可能想在析构函数中调用unsubscribe - 但是你可以根据自己的需要调用它。

答案 1 :(得分:3)

我使用Observer Pattern和中央Controller解决了这个问题。中央控制器是唯一一个了解应用程序中所有小部件并确定它们组合方式的类。如果有人在小部件A上更改某些内容,则小部件A将触发事件。在事件处理程序中,您通过'notifyObservers()'调用来调用中央控制器,该调用向中央控制器(以及可选的其他人,但为了简单起见,我不会进入)调用某个操作(传递'MyEvent'枚举实例)已经发生了。

这样,应用程序流逻辑包含在单个中心类中,并且小部件不需要彼此引用的意大利面。

答案 2 :(得分: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);
}

如果我们现在有一个实现NotificationHanlder的小部件,我们可以 通过调用:

来触发事件
((NotificationHandler)widget).onNotification(event);