Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 处理点击GWT FlowPanel的方法是什么_Javascript_Gwt_Dom Events - Fatal编程技术网

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

Javascript 处理点击GWT FlowPanel的方法是什么,javascript,gwt,dom-events,Javascript,Gwt,Dom Events,这可能是个愚蠢的问题,但GWT FlowPanel(原始div元素)没有提供处理鼠标点击/鼠标移动的功能。重写onBrowserEvent也不起作用 如果使用本机JavaScript设置onclick事件(如果未指定,'div'的高度为0),则捕获这些事件工作正常。有没有不使用JSNI的方法可以做到这一点?似乎这个问题很愚蠢,是的FlowPanel可以很容易地包装或替换为FocusPanel,它提供了许多监视/处理事件的方法。这里需要做的是将FlowPanel包装在FocusPanel中。Foc

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


如果使用本机JavaScript设置
onclick
事件(如果未指定,'div'的高度为
0
),则捕获这些事件工作正常。有没有不使用JSNI的方法可以做到这一点?

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

这里需要做的是将FlowPanel包装在FocusPanel中。FocusPanel包含所有可能的处理程序,因此可以为其设置ClickHandler

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


我个人会推荐第一种方法。它更简单,编码速度更快,并且不会降低应用程序的速度。

实际上,您可以这样做:

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

这对我很有效(显然,用你的CLICKHANDLER的名字代替“你的CLICKHANDLER”):


我找到的最好的解决办法是

我们的想法是扩展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()); 
    } 
} 

只需用FocusPanel包装FlowPanel,它也会为其他用户交互留下准备:

来源:

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

好吧,如果我正确理解FlowPanel和FocusPanel,你不能用FocusPanel替换FlowPanel,但你可以肯定地将FlowPanel包装在FocusPanel中。是的,
FocusPanel
SimplePanel
实现,因此它不能包含多个子小部件。但是如果你的
FlowPanel
只包含一个,你可以简单地用
FocusPanel
:)替换它。好吧,只为一个孩子使用一个FlowPanel是没有用的。是的,这是一个有点黑客的方式,但是如果用户受到FlowPanel使用的限制,这个技巧对他来说是可行的。谢谢,如果我能给这个答案多次投票,我会的。对于那些不想接受所有类型活动的人来说,这也是一个很好的解决方案!谢谢
    FlowPanel flowPanel = new FlowPanel();
    FocusPanel focusPanel = new FocusPanel(flowPanel);
    focusPanel.addClickHandler(new ClickHandler() {
        @Override
        public void onClick(ClickEvent event) {
            Window.alert("Hi!");
        }
    });