我很难在着名的DOM.appendChild之后捕获事件。经过多次尝试使用处理程序后,我找到了this answer,其中@Õzbek通过监听器完成了这项工作。 现在我不明白为什么“听众”有效而“处理者”没有。 作为代码中的示例:
Button button = new Button("Test button");
DOM.appendChild(getElement(), button.getElement());
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
GWT.log("this doesn't work");
}
});
DOM.sinkEvents(button.getElement(), Event.ONCLICK);
DOM.setEventListener(button.getElement(), new EventListener() {
public void onBrowserEvent(Event event) {
GWT.log("this works perfectly!");
}
});
听众将会工作但处理程序不会。
我正在尝试理解侦听器和处理程序之间的区别。 I read these answers表明没有太大的区别,但我仍然没有得到它
答案 0 :(得分:2)
Button是一个Widget而不是一个元素,如果你把它作为一个元素添加到dom中,你就会丢失这些事件。您可以将其附加到RootPanel:
RootPanel.get().add(button)
如果你想使用处理程序。
如果你想使用元素而不是小部件你可以使用DOM.createButton()
,并使用监听器。
答案 1 :(得分:2)
setEventListener
窗口小部件仅在它们“附加”时被调用(对于父窗口小部件,它本身已附加,或者在连接之前被延迟),并且您永远不会“附加”该按钮。
使用明确的serEventListener
,您完全绕过小部件内部(和生命周期)。在这种情况下,您实际上只能使用ButtonElement
。
TL; DR:不这样做,这是设计破碎的症状。