【问题标题】:GWT UiHandler on HTMLPanelHTMLPanel 上的 GWT UiHandler
【发布时间】:2011-02-04 23:10:35
【问题描述】:

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

<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 附加事件注释。

【问题讨论】:

    标签: gwt event-handling uibinder


    【解决方案1】:

    您可能正在寻找FocusPanel - 它拥有所有好东西:HasAllFocusHandlersHasAllKeyHandlersHasAllMouseHandlersHasBlurHandlersHasClickHandlers.... 一些 :) 我发现它是将点击处理程序附加到面板的最简单和最好的方法。

    【讨论】:

    • 成功了,谢谢!我必须修改我的标记以在包含标签和图像的 FocusPanel 下直接有一个 FlowPanel,因为 FlowPanel 是一个 SimplePanel 并且只能有一个小部件。除此之外,工作就像一个魅力。我唯一的不满是它会产生一些额外的、不必要的标记,我不喜欢这种标记,但我很快意识到在 GWT 世界中人们似乎并不关心这一点。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果您想使用@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);
          }
      ...
      }
      

      【讨论】:

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