如何在GWT1.6中向复合面板添加事件处理程序

如何在GWT1.6中向复合面板添加事件处理程序,gwt,handlers,event-handling,Gwt,Handlers,Event Handling,这可能是一件非常简单的事情,但我不知道如何实现以下内容 package mods.client.resultSelector; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.user.client.ui.AbsolutePanel; import com.google.gwt

这可能是一件非常简单的事情,但我不知道如何实现以下内容

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Composite;

public class MousyAbsolutePanel extends Composite implements MouseDownHandler {

    AbsolutePanel abs = new AbsolutePanel();

    public MousyAbsolutePanel(int width){
        System.out.println("MousyAbsolutePanel being created with width:" + width);
        initWidget(abs);
        abs.setWidth(String.valueOf(width));
        abs.setHeight("100%");
        abs.setStyleName("mousyAbsolutePanel");
    }

    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

}
我想要一个能有效地接受鼠标事件的绝对面板。但是,在复合对象中,我不知道如何将我编写的处理程序(onMouseDown()东西)与abs变量联系起来。简而言之,我希望abs AbsolutePanel在被点击时做出响应,但AbsolutePanel不会自然地接受点击事件。我该怎么做呢


如果这很简单,我会提前道歉,但我只是不太知道如何实现这种行为,而且在我做的搜索中也没有提到过它。

学习如何/做什么最好的方法是看一个例子。例如,FocusWidget类(实现HasClickHandlers)


具体地说,请查看addClickHandler()方法,并对其进行跟踪。

在这种情况下,扩展组合可能不是最好的主意,除非您故意阻止对构造函数中创建的AbsolutePanel的访问。如果扩展AbsolutePanel,您将能够重用代码来添加/删除小部件等

以下是我建议您的做法:

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.HasMouseDownHandlers;
import com.google.gwt.user.client.ui.AbsolutePanel;


public class MousyAbsolutePanel extends AbsolutePanel implements
                         MouseDownHandler,HasMouseDownHandlers {

    public MousyAbsolutePanel(int width) {
        System.out.println("MousyAbsolutePanel being created with width:" + width);

        this.setWidth(String.valueOf(width));
        this.setHeight("100%");
        this.setStyleName("mousyAbsolutePanel");

        this.addMouseDownHandler(this);
    }

    /** 
     * MouseDownHandler
     */
    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

    /**
     * HasMouseDownHandlers - Code to add handlers to the panel
     */  
    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
         return addDomHandler(handler, MouseDownEvent.getType());
    }

}

然后,您可以使用访问AbsolutePanel的相同方式访问MousyAbsolutePanel,但需要使用其他事件处理程序、样式等

一旦调用
initWidget(Widget)
Composite
将正确代理事件注册。因此,您只需调用
mousyabsolutionpanel
继承的
addDomHandler(…)

以下是另一篇可能有用的帖子:

调用
sinkEvents(Event.ONCLICK)
然后只使用
addHandler
添加一个
ClickHandler
对我来说非常有用