2010-06-08 75 views
12

可能是一个愚蠢的问题,但GWT FlowPanel(原始div元素)没有提供处理鼠标点击/鼠标移动的东西。重写onBrowserEvent也不起作用。GWT:什么是处理方式点击GWT FlowPanel

如果使用原生JavaScript设置onclick事件(如果未指定,需要指定正高度,'div'的高度为0),那么捕获这些事件正常工作。有没有办法做到这一点,而不使用JSNI?

回答

18

你需要做的是将你的FlowPanel包裹在FocusPanel中。一个FocusPanel包含所有可能的处理程序,因此可以让你设置一个ClickHandler。

另一种方法是创建自己的窗口小部件,以扩展流程面板并实现必要的接口以便能够包含ClickHandler。

我个人会推荐第一种方法。代码更简单,速度更快,并且不会减慢应用程序的运行速度。

0

似乎问题是愚蠢的,是的。 FlowPanel可以很容易地包装或替换为FocusPanel,它提供了很多监控/处理事件的方法。

+0

好吧,如果我理解FlowPanel和FocusPanel,你不能用FocusPanel替代FlowPanel,但你可以确定将一个FlowPanel包装在一个FocusPanel中。 – Zwik 2010-06-08 12:35:36

+0

是的,'FocusPanel'是'SimplePanel'的实现,所以它不能包含多个子窗口小部件。但是如果你的'FlowPanel'只包含一个,你可以简单地用'FocusPanel'来代替它:)。 – 2010-06-08 12:40:05

+2

那么,只有一个孩子使用FlowPanel将毫无用处。 – Zwik 2010-06-09 15:26:45

8

其实,你去为这样的:

FlowPanel fPanel = new FlowPanel() { 
     @Override 
     public void onAttach() { 
      super.onAttach(); 
      super.addDomHandler(handler, ClickEvent.getType()); // handler is the instance   
                   // of your ClickHandler 
     } 
} 

干杯!

+1

是的,这是一点点黑客攻击,但如果用户受到FlowPanel的限制,这个技巧可以为他工作。谢谢 – 2011-02-01 08:25:01

+0

如果我可以给这个答复多upvotes我会。 – saihgala 2013-10-09 05:05:05

5

这为我工作(显然,代替“你clickHandler事件”与您的函数clickhandler的名字):

FlowPanel field = new FlowPanel(); 

field.addDomHandler(YOUR CLICKHANDLER, ClickEvent.getType()); 
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()); 
    } 
} 
+0

这对于那些不想接受所有类型事件的人来说也是一个很好的解决方案!谢谢! – 2011-11-02 20:51:37

0

只是包装的FlowPanel用FocusPanel,这将会使准备的小部件为其他用户交互太:

来源:

FlowPanel flowPanel = new FlowPanel(); 
    FocusPanel focusPanel = new FocusPanel(flowPanel); 
    focusPanel.addClickHandler(new ClickHandler() { 
     @Override 
     public void onClick(ClickEvent event) { 
      Window.alert("Hi!"); 
     } 
    });