1

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

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

4

3 回答 3

3

这是一个非常开放式的问题 - 例如,您可以创建自己的静态事件处理程序类,小部件订阅自己。例如:

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 跟踪订阅每个命名事件的所有小部件,并调用命名类的更新​​方法,然后可以调用您想要的任何其他方法。你可能想在析构函数中调用 unsubscribe - 但你可以让它随心所欲。

于 2008-09-17T19:55:28.767 回答
3

我已经使用观察者模式和中央控制器解决了这个问题。中央控制器是唯一了解应用程序中所有小部件并确定它们组合在一起的方式的类。如果有人更改了小部件 A 上的某些内容,小部件 A 会触发一个事件。在事件处理程序中,您通过“notifyObservers()”调用调用中央控制器,它通知中央控制器(以及可选的其他控制器,但为简单起见,我不打算这样做)某个动作(传递一个“MyEvent”枚举实例) 已经发生了。

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

于 2008-09-18T07:46:02.350 回答
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);
于 2008-09-18T21:08:16.897 回答