GWT:处理点击GWT FlowPanel的方法是什么

时间:2010-06-08 10:03:16

标签: java gwt javascript-events

可能是一个愚蠢的问题,但GWT FlowPanel(原始div元素)不提供处理鼠标点击/鼠标移动的东西。覆盖onBrowserEvent也不起作用。

如果使用本机JavaScript设置onclick事件(需要先指定正高度,'div'如果未指定则高度为0),则捕获这些事件正常。有没有办法不使用JSNI呢?

6 个答案:

答案 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!");
        }
    });