为什么 Handler 在 Listener 工作时不工作?

Why Handler doesn't work while Listener does his job?

我很难在著名的 DOM.appendChild 之后赶上事件。在多次尝试使用处理程序后,我发现 this answer @Õzbek 通过侦听器完成工作。 现在我不明白为什么 "listener" 有效而 "handler" 无效。 作为代码中的示例:

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. 有什么方法可以在处理程序上执行此操作吗?

我正在尝试了解侦听器和处理程序之间的区别。 I read these answers 这表明没有太大区别,但我还是不明白

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

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

setEventListener 的小部件仅在它们 "attached" 时被调用(对于父小部件,它本身已附加,或者延迟直到它被附加),而你永远不会 "attach"按钮。

通过显式 serEventListener 您可以完全绕过小部件内部(和生命周期)。在这种情况下,您实际上可以只使用 ButtonElement

TL;DR:不要那样做,这是设计有问题的表现。