其他Composite Widgets未收到ChangeEvent

时间:2014-02-04 15:08:31

标签: java javascript html events gwt

我有很多ItemWidget扩展了Composite。如果其中一个项目收到点击事件,则应触发更改事件,其他项目窗口小部件应接收此事件。

尝试了以下内容:

public class ItemWidget extends Composite implements HasChangeHandlers {

   FocusPanel focusPanel = new FocusPanel();

   public ItemWidget() {

       Label label = new Label("click me");
       focusPanel.add(label);
       initWidget(focusPanel);

            focusPanel.addClickHandler(new ClickHandler() {

                @Override
                public void onClick(ClickEvent event) {
                    // inform other items
                    fireChange();

                }
            });

            addChangeHandler(new ChangeHandler() {

                @Override
                public void onChange(ChangeEvent event) {
                    GWT.log("ChangeEvent received");
                }
            });
   }

    private void fireChange() {
        GWT.log("fire event");
        NativeEvent nativeEvent = Document.get().createChangeEvent();
        ChangeEvent.fireNativeEvent(nativeEvent, this);
    }


    @Override
    public HandlerRegistration addChangeHandler(ChangeHandler handler) {
        return addDomHandler(handler, ChangeEvent.getType());
    }

}

使用上面的代码,只有被点击的项目会收到ChangeEvent。

如何在所有其他项目小部件上收到ChangeEvent?

2 个答案:

答案 0 :(得分:2)

通常,当事件触发时,演示者/活动对其他窗口小部件进行必要的更改。

如果您希望您的小部件的多个副本能够收听同一事件,那么最好使用EventBus,特别是如果您多次使用此模式:

How to use the GWT EventBus

然后,每个ItemWidget都可以触发一个自定义事件,该窗口小部件的所有副本都会监听。

答案 1 :(得分:0)

通过快速查看API,我认为您的问题来自于

的实施
public void fireEvent(GwtEvent<?> event)

您没有在复合视图中覆盖它。您没有创建任何将事件发送到其他小部件的机制。

深入了解fireNativeEvent方法 http://www.gwtproject.org/javadoc/latest/com/google/gwt/event/dom/client/DomEvent.html

当您使用ChangeEvent.fireNativeEvent时,第二个参数hasHandlers应该是一种事件总线。

要做你想做的事情,我认为你需要这个eventBus上的所有项目。