小部件通知其他小部件

时间:2020-03-05 18:58:51  来源:igfitidea点击:

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

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

解决方案

回答

例如,这是一个非常开放的问题,我们可以创建自己的静态事件Handler类,窗口小部件将自己订阅。例如:

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方法,然后可以调用我们想要的任何其他方法。我们可能想在析构函数中调用取消订阅,但是可以根据需要将其设置为花哨。

回答

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

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

回答

这是我的(示例)实现,
首先让我们创建一个新事件:

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