HTMLPanel上的GWT UiHandler

时间:2010-04-06 19:14:58

标签: gwt event-handling uibinder

我正在编写一个带有以下标记的小部件:

<g:HTMLPanel ui:field="shortcutPanel" styleName="{style.shortcut}">
    <g:Image ui:field="shortcutImage"></g:Image>
    <span ui:field="shortcutLabel"></span>
</g:HTMLPanel>

所以基本上是一个包装和图像和标签的div。现在,我不想在图像/跨度上添加事件处理程序,而是希望将onClick与HTMLPanel相关联。然而我的问题是gwt告诉我

  

shortcutPanel没有关联的addClickHandler方法

所以我假设不同之处在于HTMLPanel没有实现HasClickHandlers或沿着那条线的东西。我想知道将点击处理程序附加到诸如HTMLPanel之类的Ui元素的标准方法是什么,甚至更好,是否有这样的GWT Widget本质上是一个div包装器,我可以轻松地将事件附加到@UiHandler注释

4 个答案:

答案 0 :(得分:20)

您可能正在寻找FocusPanel - 它有所有好处:HasAllFocusHandlersHasAllKeyHandlersHasAllMouseHandlersHasBlurHandlers {{1 } ....命名一些 :)我发现这是将点击处理程序附加到Panel的最简单和最好的方法。

答案 1 :(得分:7)

我之前没有这样做,但您可以执行以下操作:

  • 创建扩展MyPanel并实施HTMLPanel
  • 的自定义类HasClickHandlers
  • MyPanel.java
  • 中添加以下方法
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }
  • 然后在您的ui.xml中用HTMLPanel替换MyPanel及其相应的Java实现。

您始终可以查看HTMLTable的实现,以了解事件传播的工作原理。它是Panel并实现HasClickHandlers

答案 2 :(得分:2)

俱佳, 它有效。

public class LiPanel extends HTMLPanel implements HasClickHandlers {

    LiPanel() {
        super("li", "");
    }

    @Override
    public HandlerRegistration addClickHandler(ClickHandler handler) {
        return addDomHandler(handler, ClickEvent.getType());
    }

}

答案 3 :(得分:1)

如果要使用@UiHandler批注为自定义窗口小部件注册事件处理程序,则需要重新实现addXXHandler方法。 GWT编译器似乎没有在超类中找到它们。例如如果你想使用

@UiHandler("myCustomWidget")
public void handleWidgetSelectionChangeEvent(final SelectionEvent<CountryDts> event) {
...
}

并且您的CustomWidget扩展了一个正在运行的类,您可能需要将HasSelectionHandlers接口显式添加到您的类中:

public class CustomComboBox<D> extends ComboBox<D> implements HasSelectionHandlers<D> {

    @Override
    @SuppressWarnings("pmd.UselessOverridingMethod")
    public HandlerRegistration addSelectionHandler(final SelectionHandler<D> handler) {
        // GWT Compile doesn't recognize method in supertype for UIHandler
        return super.addSelectionHandler(handler);
    }
...
}