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

时间:2011-05-20 19:09:52

标签: gwt

我正在使用GWT。我开始通过添加EventHandlers将事件添加到我的小部件中。

事件处理程序示例代码:

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

然后我发现还有另一种方法可以使用sinkEvents()来处理事件。

接收事件示例代码(from this website):

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

1 个答案:

答案 0 :(得分:12)

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

  1. 所有EventHandlers(最终)调用调用sinkEvents()的{​​{3}}。 sinkEvents()是较低级别的,是围绕本机javascript事件处理的浏览器抽象包装器。

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

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

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

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