当Listener完成他的工作时,为什么Handler不起作用?

时间:2017-03-08 09:55:22

标签: java gwt event-handling listener

我很难在着名的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!");
    }
});

听众将会工作但处理程序不会。

  1. 那么他们的差异在哪里呢?
  2. 如何强制处理程序工作?
  3. 是否有办法在处理程序上执行此操作?
  4. 我正在尝试理解侦听器和处理程序之间的区别。 I read these answers表明没有太大的区别,但我仍然没有得到它

2 个答案:

答案 0 :(得分:2)

Button是一个Widget而不是一个元素,如果你把它作为一个元素添加到dom中,你就会丢失这些事件。您可以将其附加到RootPanel: RootPanel.get().add(button)如果你想使用处理程序。

如果你想使用元素而不是小部件你可以使用DOM.createButton(),并使用监听器。

答案 1 :(得分:2)

setEventListener窗口小部件仅在它们“附加”时被调用(对于父窗口小部件,它本身已附加,或者在连接之前被延迟),并且您永远不会“附加”该按钮。

使用明确的serEventListener,您完全绕过小部件内部(和生命周期)。在这种情况下,您实际上只能使用ButtonElement

TL; DR:不这样做,这是设计破碎的症状。