【问题标题】:Why Handler doesn't work while Listener does his job?为什么 Handler 不工作,而 Listener 工作?
【发布时间】:2017-07-28 19:53:10
【问题描述】:

在著名的 DOM.appendChild 之后,我很难捕捉到事件。在多次尝试使用处理程序后,我找到了@Õzbek 通过监听器完成工作的this answer。 现在我不明白为什么“侦听器”有效而“处理程序”无效。 以代码为例:

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 表示没有太大区别,但我还是不明白

【问题讨论】:

    标签: java gwt event-handling listener


    【解决方案1】:

    setEventListener 的小部件仅在它们“附加”时调用(到父小部件,它本身已附加,或延迟到它附加),并且您永远不会“附加”按钮。

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

    TL;DR:不要那样做,这是设计损坏的表现。

    【讨论】:

    • 但在某些情况下,您没有其他选择,例如,如果您想扩展 TextBox 并在按钮内添加显示一些帮助器的按钮,那么侦听器只是一个选择,对吗?跨度>
    • 您不会“扩展文本框并添加按钮”,而是在复合小部件中组合文本框和按钮。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2012-06-13
      • 2010-09-30
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      相关资源
      最近更新 更多