1

我正在尝试通过 gwt 事件总线发送一个对象,但我不知道为什么它不起作用。

通常,我有一个组件 A 会创建一个弹出窗口。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));

通知“收到事件”永远不会被调用。

我肯定错过了什么。谢谢你的帮助

4

2 回答 2

5

您正在创建一个 EventBus 的新实例并在该新实例上定义 eventHandler。

我看不到您是如何调用该fireEvent方法的(或者您从哪个 eventBus 实例调用它),但您需要在您传递的代码中定义一个 eventBus 实例

因此,您实例化一个 eventBus,然后定义您希望它拥有的任何处理程序,然后让任何将与 eventBus 交互的组件接受“MyEventHandler”作为构造函数的参数。然后,您可以将事件总线的预定义实例传递给该组件,允许该组件稍后与您的应用程序拥有的单个 eventBus 进行交互。

于 2012-04-11T15:46:45.913 回答
2

正如@Jeff Allen 所写。每个小部件都有其私有 EventBus 实例(它不是静态的)。如果您的事件不是特定于实例的,您可以直接使用 EventBus,而不是通过 Widgets 包装器方法。您的 Event 和 Handler 类已经为此做好了充分的准备。

请参阅http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/event/shared/EventBus.html上的javadoc (正如您所注意到的,Widgets 事件方法只是对 evtnbus 方法的包装。

于 2012-04-11T18:26:59.163 回答