4

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

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()");
    }

}

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

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

4

4 回答 4

5

在这种情况下,扩展 Composite 可能不是最好的主意,除非您故意阻止对您在构造函数中创建的 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,但使用额外的事件处理程序、样式等。

于 2009-05-21T15:47:04.130 回答
1

这是另一篇可能有帮助的帖子:

将 ClickHandler 添加到包含许多其他小部件的 div

调用sinkEvents(Event.ONCLICK)然后添加ClickHandlerusing 仅对addHandler我有用。

于 2011-04-05T12:25:09.617 回答
0

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

具体来说,查看 addClickHandler() 方法,并跟踪它。

于 2009-05-07T15:22:59.920 回答
0

一旦您调用initWidget(Widget)Composite将正确代理事件注册。所以,你可以只调用MousyAbsolutePanel's dedicated addDomHandler(...)

于 2009-06-02T19:05:02.333 回答