我正在尝试通过gwt事件总线发送一个对象,我不知道它为什么不起作用。
通常,我有一个创建弹出窗口的组件A.注册弹出窗口,弹出窗口触发事件。 现在,监听器(OtherComponent)与弹出窗口无关。当弹出窗口触发事件时,另一个组件无法捕获它。
这是我的代码:
处理程序:
public interface MyEventHandler extends EventHandler {
public void onChanged(MyEvent event);
}
活动:
public class MyEvent extends GwtEvent<MyEventHandler> {
private static final GwtEvent.Type<MyEventHandler> TYPE = new GwtEvent.Type<MyHandler>();
private MyBean my;
public MaterielEvent(My bean) {
my = bean;
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<MyEventHandler> getAssociatedType() {
return TYPE;
}
public static Type<MyEventHandler> getType() {
return TYPE;
}
@Override
protected void dispatch(MyEventHandler handler) {
handler.onChanged(this);
}
public MyBean getBean() {
return my;
}
}
组件:
public class OtherPanel extends Composite implements HasMyEventHandlers {
interface OtherPanelUiBinder extends UiBinder<Widget, OtherPanel> {}
private static OtherPanelUiBinder uiBinder = GWT.create(OtherPanelUiBinder.class);
public OtherPanel() {
this.addMyEventHandler(new MyEventHandler() {
@Override
public void onChanged(MyEvent event) {
NotificationManager.success("event recieved");
}
});
initWidget(uiBinder.createAndBindUi(this));
}
@Override
public HandlerRegistration addMyEventHandler(MyEventHandler handler) {
return addHandler(handler, MyEvent.getType());
}
}
致电(在另一个组件内):
fireEvent(new MyEvent(myBean));
永远不会调用通知“收到的事件”。
我肯定错过了什么。谢谢你的帮助
答案 0 :(得分:5)
您正在创建EventBus的新实例并在该新实例上定义eventHandler。
我无法看到你是如何调用fireEvent
方法(或者是调用它的eventBus的实例),但你需要有一个单个 eventBus实例在您传递的代码中定义。
因此,您实例化一个eventBus,然后定义您希望它拥有的任何处理程序,然后让任何与eventBus交互的组件接受“MyEventHandler”作为构造函数的参数。然后,您可以将事件总线的预定义实例传递到该组件,从而允许该组件稍后与您的应用程序具有的单个eventBus进行交互。
答案 1 :(得分:2)
正如@Jeff Allen所写。每个小部件都有其私有的EventBus实例(它不是静态的)。 如果您的事件不是特定于实例的,则可以直接使用EventBus,而不是通过Widgets包装器方法。您的事件和处理程序类已经为此做好了准备。
请参阅http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/event/shared/EventBus.html处的javadoc(您注意到Widgets事件方法只是对evtnbus方法的包装。