事件处理-GWT Widget.addHandler



我正在尝试使用Widget.addHandler()。但是,处理程序永远不会被调用。下面是我的示例代码。我需要更改什么来修复此问题?

我的处理程序实现:

public class CustomMouseMoveHandler
  extends GwtEvent.Type<MouseMoveHandler>
  implements MouseMoveHandler
{
  @Override
  public void onMouseMove(MouseMoveEvent event) {
    System.out.println("----> onMouseMove.");
  }
}

我的EntryPoint.OnModuleLoad():

ContentPanel cp = new ContentPanel();
cp.setHeaderVisible(false);
cp.setHeight(com.google.gwt.user.client.Window.getClientHeight());
CustomMouseMoveHandler handler = new CustomMouseMoveHandler();
cp.addHandler(handler, handler);
RootPanel.get().add(cp);

/////2011年7月1日添加。

以下完整的GWT简单代码也不起作用(应用了Jason的提示(。请帮帮我。感谢

 package tut.client;
 import com.google.gwt.core.client.EntryPoint;
 import com.google.gwt.event.dom.client.MouseMoveEvent;
 import com.google.gwt.event.dom.client.MouseMoveHandler;
 import com.google.gwt.user.client.ui.RootPanel;
 import com.google.gwt.user.client.ui.TextArea;
  /**
  * Entry point classes define <code>onModuleLoad()</code>.
  */
    public class GwtHandler implements EntryPoint, MouseMoveHandler {
        /**
         * This is the entry point method.
         */
        public void onModuleLoad() {
           TextArea comp = new TextArea();
           comp.setSize("200px", "200px");
           comp.setText("Testing Text");        
           comp.addHandler(this, MouseMoveEvent.getType());
           RootPanel.get().add(comp);
        }
       @Override
       public void onMouseMove(MouseMoveEvent event) {
           com.google.gwt.user.client.Window.alert("onMouseMove");
       }
}

GwtEvent.Type用于基于特定于事件且唯一的对象调度事件(对象相等-==-用于匹配事件类型(。将您的CustomMouseMoveHandler作为Type传递给addHandler指示除用于MouseMoveEvent的事件类型之外的事件类型(事实上,在这种情况下,每个CustomMouseMoveHandler都将被分配给不同的事件Type,因为每个对象都不同(。

您不需要在处理程序中扩展GwtEvent.Type<MouseMoveHandler>,而是需要从MouseMoveEvent本身获取事件Type(使用静态getType()方法(。

不要在CustomMouseMoveHandler:中扩展GwtEvent.Type

public class CustomMouseMoveHandler
  implements MouseMoveHandler
{
  ...
}

并添加处理程序:

cp.addDomHandler(handler, MouseMoveEvent.getType());

必须使用addDomHandler注册DomEvents,或者必须为其事件类型设置sinkEvents。addDomHandler是sinkEvents+addHandler的快捷方式。

以下是我解决问题的方法。我想向NumberLabel添加处理程序。这是行之有效的:

    final NumberLabel<Long> label = new NumberLabel<Long>();
    label.setValue(2000l);
    label.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
    MouseOverHandler handler = new MouseOverHandler() {
        public void onMouseOver(MouseOverEvent event) {
            System.out.println("mouse over");
        }
    };
    Widget widget = label.asWidget();
    widget.addDomHandler(handler, MouseOverEvent.getType());

把它当作一个小部件来处理。

顺便说一下,System.out.println起了作用。

最新更新