我有很多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?
答案 0 :(得分:2)
通常,当事件触发时,演示者/活动对其他窗口小部件进行必要的更改。
如果您希望您的小部件的多个副本能够收听同一事件,那么最好使用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上的所有项目。