2

我正在尝试利用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");
       }
}
4

3 回答 3

9

GwtEvent.Type用于基于事件特定且唯一的对象调度事件(对象相等 - ==- 用于匹配事件类型)。CustomMouseMoveHandler将您的as传递给TypetoaddHandler表示事件类型与用于MouseMoveEvents 的事件类型不同(实际上,在这种情况下,每个对象都CustomMouseMoveHandler将分配给不同的事件Type,因为每个对象都是不同的)。

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

不要GwtEvent.Type在你的CustomMouseMoveHandler

public class CustomMouseMoveHandler
  implements MouseMoveHandler
{
  ...
}

并添加处理程序:

cp.addDomHandler(handler, MouseMoveEvent.getType());
于 2011-06-30T17:06:41.287 回答
5

DomEvents 必须使用 addDomHandler 注册,或者您必须为它们的事件类型接收 sinkEvents。addDomHandler 是 sinkEvents+addHandler 的快捷方式。

于 2011-07-01T14:05:53.843 回答
4

这是我解决问题的方法。我想将处理程序添加到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());

将其视为 Widget 就可以了。

顺便说一句,System.out.println工作。

于 2012-06-23T17:02:58.683 回答