7

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

<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或类似的东西。我想知道将点击处理程序附加到 Ui 元素(例如 HTMLPanel 甚至更好)的标准方法是什么,是否有这样的 GWT 小部件,它本质上是一个 div 包装器,我可以很容易地使用 @UiHandler 附加事件注解。

4

3 回答 3

21

您可能正在寻找FocusPanel- 它具有所有优点:HasAllFocusHandlers, HasAllKeyHandlers, HasAllMouseHandlers, HasBlurHandlers, HasClickHandlers.... 仅举几例:) 我发现它是将点击处理程序附加到面板的最简单和最好的方法。

于 2010-04-06T22:14:13.043 回答
7

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

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

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

于 2010-04-06T19:32:15.333 回答
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);
    }
...
}
于 2012-11-07T16:26:37.080 回答