我如何使用GWT Widget.fireEvent?

时间:2016-03-23 12:34:36

标签: gwt

我想让一个子窗口小部件触发一个事件,它的父窗口会对它作出反应。据我所知,这是Widget.fireEvent的用途。但是以下代码不起作用:

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.fireEvent错误吗?

1 个答案:

答案 0 :(得分:0)

ChangeEvent是一个DOM事件,表示浏览器从该窗口小部件中的一个dom元素触发了change事件。

除了GWT的内部浏览器事件连接之外,该类并不意味着创建实例,这就是为什么在代码中需要创建它的子类以便甚至创建实例。发射这种类型的事件实际上并不会导致元素发生变化,所以我不清楚你在这里做了什么。

请考虑使用逻辑事件ValueChangeEvent<T>来指示窗口小部件中的值已更改,但要正确使用,触发窗口小部件应实现HasValueChangeHandlers<T>

最后,您从horizontalPanel实例中触发了该事件,但正在从verticalPanel进行侦听,因此您不会看到此事件发生。虽然浏览器事件在dom元素中冒泡(直到某些东西调用stopPropagation()),但实际上你并没有在元素上触发dom事件,而是从窗口小部件中触发包装类,所以没有冒泡会发生。