如何使用GWT Widget.firevent?

如何使用GWT Widget.firevent?,gwt,Gwt,我想让一个子部件触发一个事件,并让它的父部件对它做出反应。据我所知,Widget.firevent就是为了这个。但以下代码不起作用: public class EntryPointClass implements EntryPoint { private final HorizontalPanel horizontalPanel = new HorizontalPanel(); public void onModuleLoad() { VerticalPanel verticalPane

我想让一个子部件触发一个事件,并让它的父部件对它做出反应。据我所知,
Widget.firevent
就是为了这个。但以下代码不起作用:

public class EntryPointClass implements EntryPoint {
private final HorizontalPanel horizontalPanel = new HorizontalPanel();
public void onModuleLoad() {
    VerticalPanel verticalPanel = new VerticalPanel();
    verticalPanel.add(horizontalPanel);
    horizontalPanel.setHeight("500px");
    horizontalPanel.setWidth("500px");
    horizontalPanel.addDomHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent clickEvent) {
            log("onClick");
            horizontalPanel.fireEvent(new ChangeEvent() {
            });
        }
    }, ClickEvent.getType());
    verticalPanel.addDomHandler(new ChangeHandler() {
        @Override
        public void onChange(ChangeEvent changeEvent) {
            log("onChange");
        }
    }, ChangeEvent.getType());
    RootPanel.get().add(verticalPanel);
}

private static native void log(String msg) /*-{
    $wnd.console.log(msg);
}-*/;
}


onClick
会被打印,但
onChange
不会。我做错了什么?或者我是否理解了
Widget.firevent
的用途有误?

ChangeEvent
是一个DOM事件,表示浏览器从该Widget中的一个DOM元素触发了一个事件

除了GWT的内部浏览器事件连接之外,该类并不意味着要创建实例,这就是为什么在代码中需要创建它的子类才能创建实例的原因。触发这种类型的事件实际上不会导致元素发生更改,因此我不确定在这里执行此操作的目的是什么

考虑使用逻辑事件
ValueChangeEvent
来指示小部件中的值已更改,尽管要正确使用,触发小部件应实现
hasvaluechangeholders



最后,您从
horizontalPanel
实例触发了事件,但正在从
verticalPanel
监听,因此您不会看到这种情况发生。当浏览器事件在dom元素中冒泡时(直到有东西调用它们上的
stopPropagation()
),您实际上并不是在元素上触发dom事件,而是在启动小部件的包装类,因此不会发生冒泡标记添加处理程序来监听“全局”事件更有意义。