EventHandlers和SinkEvents是否正在执行相同的功能工作?

Tre*_*ith 16 gwt

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

事件处理程序示例代码

    widget.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            // do something
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后我发现还有另一种使用sinkEvents()处理事件的方法.

Sink事件示例代码(来自本网站):

 {
 ...
 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;
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)
  1. EventHandlers和SinkEvents是否正在执行相同的功能工作?
  2. 如果是,有什么权衡?(你会在哪里使用其中一个)
  3. 如果不是,它们有何不同?

Pet*_*ego 12

我不是GWT专家,但这是我从GWT来源收集的内容:

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

    EventHandlers构建在sinkEvents之上,因此它们提供了sinkEvents所具有的所有功能.

    但是在使用方面它们是不同的:使用EventHandlers,您可以使用可以驻留在不同类中的不同事件处理程序注册不同的事件类型.事件将自动路由到适当的处理程序.使用sinkEvents,您可以注册不同的事件类型(通过int,而不是类型安全),但总是onBrowserEvent(event)会调用此小部件.

  2. EventHandlers增加了一些开销.如果这很重要,这是值得商榷的.

  3. EventHandlers是一种类型安全的方法,用于添加和删除事件处理程序,以及将事件路由到您选择的注册处理程序的自动方式.如果您使用GWT Widgets,则应使用EventHandlers.