【问题标题】:How to add event handlers to composite panels in GWT 1.6如何在 GWT 1.6 中向复合面板添加事件处理程序
【发布时间】:2009-05-06 19:01:22
【问题描述】:

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

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

}

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

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

【问题讨论】:

    标签: gwt handlers event-handling


    【解决方案1】:

    在这种情况下,扩展 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,但需要额外的事件处理程序、样式等。

    【讨论】:

      【解决方案2】:

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

      Adding ClickHandler to div which contains many other widget

      调用sinkEvents(Event.ONCLICK),然后仅使用addHandler 添加ClickHandler 对我来说效果很好。

      【讨论】:

        【解决方案3】:

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

        具体来说,看一下addClickHandler()方法,一探究竟。

        【讨论】:

          【解决方案4】:

          一旦您调用initWidget(Widget)Composite 将正确代理事件注册。所以,你可以直接调用MousyAbsolutePanel继承的addDomHandler(...)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多