Gwt EventHandler和SinkEvents是否执行相同的功能性工作?

Gwt EventHandler和SinkEvents是否执行相同的功能性工作?,gwt,Gwt,我正在使用GWT。我开始通过添加EventHandler向我的小部件添加事件 事件处理程序示例代码: widget.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { // do something } }); 然后我发现有另一种方法可以使用sinkEvents()处理事件 接收器事件示

我正在使用GWT。我开始通过添加EventHandler向我的小部件添加事件

事件处理程序示例代码:

    widget.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            // do something
        }
    });
然后我发现有另一种方法可以使用sinkEvents()处理事件

接收器事件示例代码():

  • EventHandler和SinkEvents的功能是否相同?
  • 如果是,权衡是什么?(您会在哪里使用一个而不是另一个)
  • 如果没有,它们有什么不同?

  • 我不是GWT专家,但我通过查看GWT源代码得出以下结论:

  • 所有EventHandler(最终)调用调用
    sinkEvents()
    sinkEvents()
    是较低级别的,是围绕本机javascript事件处理的浏览器抽象包装

    EventHandler构建在sinkEvents之上,因此它们提供sinkEvents所提供的所有功能

    但从使用角度看,它们是不同的:使用EventHandler,您可以使用驻留在不同类中的不同事件处理程序注册不同的事件类型。事件将自动路由到适当的处理程序。使用sinkEvents,您可以注册不同的事件类型(通过int,不是类型安全的),但始终会调用此小部件的
    onBrowserEvent(event)

  • 事件处理程序增加了一定的开销。这件事是否重要还有争议

  • EventHandler是添加和删除事件处理程序的类型安全方式,也是将事件路由到所选注册处理程序的自动方式。如果使用GWT小部件,则应使用EventHandler

  • 您说过“如果您使用GWT小部件,那么您应该使用EventHandler。”。。。为什么要提供较低级别的抽象sinkEvents()?
     {
     ...
     sinkEvents(Event.ONMOUSEDOWN | Event.ONMOUSEUP | Event.ONMOUSEOVER |Event.ONMOUSEOUT)
     ...
     }
    
     public void onBrowserEvent(Event event) {
         Element td = getEventTargetCell(event);
         if (td == null) return;
         Element tr = DOM.getParent(td);
         switch (DOM.eventGetType(event)) {
             case Event.ONMOUSEDOWN: {
                     // do something
                     break;
             }
             case Event.ONMOUSEUP: {
                     // do something
                     break;
             }
             case Event.ONMOUSEOVER: {
                     // do something
                     break;
             }
             case Event.ONMOUSEOUT: {
                     // do something
                     break;
             }
         }
     }