我正在编写一个带有以下标记的小部件:
<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注释
答案 0 :(得分:20)
您可能正在寻找FocusPanel
- 它有所有好处:HasAllFocusHandlers
,HasAllKeyHandlers
,HasAllMouseHandlers
,HasBlurHandlers
, {{1 } ....命名一些 :)我发现这是将点击处理程序附加到Panel的最简单和最好的方法。
答案 1 :(得分:7)
我之前没有这样做,但您可以执行以下操作:
MyPanel
并实施HTMLPanel
HasClickHandlers
MyPanel.java
public HandlerRegistration addClickHandler(ClickHandler handler) {
return addDomHandler(handler, ClickEvent.getType());
}
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);
}
...
}