可能是一个愚蠢的问题,但GWT FlowPanel(原始div
元素)不提供处理鼠标点击/鼠标移动的东西。覆盖onBrowserEvent
也不起作用。
如果使用本机JavaScript设置onclick
事件(需要先指定正高度,'div'如果未指定则高度为0
),则捕获这些事件正常。有没有办法不使用JSNI呢?
答案 0 :(得分:20)
您需要做的是将FlowPanel包装在FocusPanel中。 FocusPanel包含所有可能的处理程序,因此可以让您设置ClickHandler。
另一种方法是创建自己的小部件,扩展流动面板并实现必要的界面,以便能够包含ClickHandler。
我个人会推荐第一种方法。它更简单,代码更快,不会减慢您的应用程序。
答案 1 :(得分:8)
实际上,你会这样做:
FlowPanel fPanel = new FlowPanel() {
@Override
public void onAttach() {
super.onAttach();
super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance
// of your ClickHandler
}
}
干杯!!!
答案 2 :(得分:6)
我找到的最佳解决方案是here。
我们的想法是扩展FlowPanel(或实际上是SimplePanel)以实现相关的处理程序接口,这对于不需要FocusPanel的完整功能和聚焦功能的情况来说是一个更简洁的选项。见下文:
public class MouseAwareFlowPanel extends FlowPanel implements
HasMouseOverHandlers, HasMouseOutHandlers, HasClickHandlers
{
public HandlerRegistration addMouseOverHandler(MouseOverHandler handler)
{
return addDomHandler(handler, MouseOverEvent.getType());
}
public HandlerRegistration addMouseOutHandler(MouseOutHandler handler)
{
return addDomHandler(handler, MouseOutEvent.getType());
}
public HandlerRegistration addClickHandler(ClickHandler handler)
{
return addDomHandler(handler, ClickEvent.getType());
}
}
答案 3 :(得分:5)
这对我有用(显然,用你的点击处理器名称替换“你的CLICKHANDLER”):
FlowPanel field = new FlowPanel();
field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType());
答案 4 :(得分:0)
似乎问题是愚蠢的,是的。 FlowPanel
可以轻松包装或替换为FocusPanel
,这为监控/处理事件提供了很多方法。
答案 5 :(得分:0)
只需使用FocusPanel包装FlowPanel,即可为其他用户交互准备好小部件:
<强>来源:强>
FlowPanel flowPanel = new FlowPanel();
FocusPanel focusPanel = new FocusPanel(flowPanel);
focusPanel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
Window.alert("Hi!");
}
});