【问题标题】:Adding ClickHandler to div which contains many other widget将 ClickHandler 添加到包含许多其他小部件的 div
【发布时间】:2011-05-17 05:49:00
【问题描述】:

Panel 似乎没有从 HasClickHandlers 继承,我无法将 clickHandler 添加到 DivElement。有什么办法可以将 clickHandler 添加到 DIV 中?

编辑:我不能使用标签的原因是我想要可点击的 DIV 包含其他 DIV。

【问题讨论】:

  • 您可以使用标签小部件。它使用 div 元素并实现 HasClickHandlers。

标签: gwt uibinder


【解决方案1】:

默认情况下,Panel 不会“接收”onCLick 事件。也就是说,单击面板实际上不会导致“ClickEvent”,因此不会触发处理程序。要将点击事件与 Panel(或任何其他 Widget)一起使用,您必须首先使用适当的事件位在其上调用 sinkEvents()。

例如:

SimplePanel p = new SimplePanel();
    p.sinkEvents(Event.ONCLICK);
    p.setTitle("Click me");
    p.setSize("600px", "600px");
    p.addHandler(new ClickHandler(){

        @Override
        public void onClick(ClickEvent event) {

            Window.alert("SimplePanel clicked!");

        }

    }, ClickEvent.getType());

上面的代码首先使用p.sinkEvents(Event.ONCLICK);“启用” SimplePanel 的点击事件,然后继续将标准 ClickHandler 添加到它上面。请注意,即使 SimplePanel 没有实现 HasClickHandlers,您也可以随时使用 addHandler() 方法添加处理程序。

【讨论】:

  • sinkEvents 解决了我不想响应 clickEvents 的 SimplePanel 的问题。
  • 改为拨打addDomHandler,然后您就不需要sinkEvents
【解决方案2】:

使用FocusPanel

一个简单的面板,使其内容具有焦点,并增加了捕捉鼠标和键盘事件的能力。

【讨论】:

  • 我的 DIV 包含其他几个小部件。我不能使用 FocusPanel,因为它只能包含 1 个小部件。
  • 这不是问题:将包含多个小部件的<div> 放在FocusPanel 中。或者有什么理由你不能这样做?
【解决方案3】:
public class ClickableDiv extends FlowPanel implements HasClickHandlers {
    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }
}

这应该就是你所需要的。 addDomHandler 将为您处理“下沉”事件类型。

【讨论】:

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