2012-04-11 82 views
1

我想通过gwt事件总线发送一个对象,我不知道为什么它不起作用。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)); 

通知“收到的事件”从不会被调用。

我肯定错过了一些东西。感谢您的帮助

+0

你能告诉周围的fireEvent调用更多的代码?你调用一个静态吗?如果没有,哪儿来的eventBus来自于你调用'fireEvent()'? – 2012-04-11 15:43:58

回答

5

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

我看不出你如何调用fireEvent方法(或什么情况下,你在呼唤它的eventBus的),但你需要在你的代码中定义您通过围绕一个 eventBus实例。

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

+0

我正在使用fireEvent()和Widget类的addHandler()。 – 2012-04-11 16:13:31

+0

对于我们的项目,我们使用一个静态的EventBus字段来解决这个问题可能会出现,因为我们有几个需要通信的GWT模块,另外,'Widget'的事件方法与EventBus的事件方法没有任何关系,它们不能相互通信。 – 2012-04-11 16:59:03