我想让一个子窗口小部件触发一个事件,它的父窗口会对它作出反应。据我所知,这是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
错误吗?
答案 0 :(得分:0)
ChangeEvent
是一个DOM事件,表示浏览器从该窗口小部件中的一个dom元素触发了change事件。
除了GWT的内部浏览器事件连接之外,该类并不意味着创建实例,这就是为什么在代码中需要创建它的子类以便甚至创建实例。发射这种类型的事件实际上并不会导致元素发生变化,所以我不清楚你在这里做了什么。
请考虑使用逻辑事件ValueChangeEvent<T>
来指示窗口小部件中的值已更改,但要正确使用,触发窗口小部件应实现HasValueChangeHandlers<T>
。
最后,您从horizontalPanel
实例中触发了该事件,但正在从verticalPanel
进行侦听,因此您不会看到此事件发生。虽然浏览器事件在dom元素中冒泡(直到某些东西调用stopPropagation()
),但实际上你并没有在元素上触发dom事件,而是从窗口小部件中触发包装类,所以没有冒泡会发生。