【问题标题】:Firing click event from code in gwt从 gwt 中的代码触发点击事件
【发布时间】:2009-08-06 11:38:52
【问题描述】:

我在 gwt 中创建了一个自定义小部件,它扩展了复合。我在其中使用焦点面板。对于 FocusPanel,我添加了 ClickHandler。然后我添加了键盘侦听器。现在按下 Enter 键它应该触发点击事件。可以有人帮我通过使用 GWT 中的代码来触发点击事件吗?

focusPanel.addKeyPressHandler(new KeyPressHandler() {
            public void onKeyPress(KeyPressEvent event) {
                if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)        {
                    // TODO call onClick() method
                }
            }
        });

谢谢

【问题讨论】:

    标签: gwt


    【解决方案1】:

    我已经完成了这段代码:

    if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)        {
        myButton.fireEvent( new GwtEvent<ClickHandler>() {
            @Override
            public com.google.gwt.event.shared.GwtEvent.Type<ClickHandler> getAssociatedType() {
            return ClickEvent.getType();
            }
            @Override
            protected void dispatch(ClickHandler handler) {
                handler.onClick(null);
            }
       });
    }
    

    当然,myButton 必须是 final 或 public,因为您在另一个事件处理程序中。

    【讨论】:

    • 我认为这是正确的答案,因为它可以完成这项工作。但是,这是很多样板代码,效果很小。希望有朝一日,Google 会将其直接包含在 GWT 测试自动化中。
    【解决方案2】:

    我还没有为点击事件这样做,但我已经完成了这样的更改事件。

    NativeEvent event = Document.get().createChangeEvent();
    DomEvent.fireNativeEvent(event, this);
    

    [createClickEvent](http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/dom/client/Document.html#createClickEvent(int,%20int,%20int,%20int,%20int,%20boolean,%20boolean,%20boolean,%20boolean)) 方法需要更多参数。

    public final NativeEvent createClickEvent(int detail,
                                              int screenX,
                                              int screenY,
                                              int clientX,
                                              int clientY,
                                              boolean ctrlKey,
                                              boolean altKey,
                                              boolean shiftKey,
                                              boolean metaKey)
    

    【讨论】:

      【解决方案3】:

      您也可以使用简单的 JSNI 方法来完成。只需传递您的元素[例如button.getElement()] 到这个方法:

      public static native void clickElement(Element elem) /*-{
          elem.click();
      }-*/;
      

      【讨论】:

        【解决方案4】:

        如果目标是一个按钮,你可以调用它的click() 方法。否则你可以这样做:

        private void click(HasHandlers handlerSource) {
          NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
          DomEvent.fireNativeEvent(event, handlerSource);
        }
        

        【讨论】:

          【解决方案5】:

          DLH 描述的方法应该可以工作,除了 detail 参数(我不知道它是做什么用的)之外,您在 KeyPressEvent 中还有其他可用的参数。

          另一种可能的解决方案是在元素上调用原生 JavaScript click()。我已经在 Button 小部件中完成了此操作(可作为开源使用)。请参阅以下类中的click() 方法:http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/java/org/cobogw/gwt/user/client/ui/Button.java),它调用特定的 Event2 类,该类实现了浏览器特定版本的 click 方法。

          要使用此方法,您可以简单地将 cobogw 提供的 jar 文件添加到您的项目中,包括 Event.gwt.xml 并在您的方法中调用 Event2.fireClickEvent(getElement()); 或仅使用类 Event2 和 Event 中的代码自己的项目

          此解决方案还允许您以编程方式触发点击事件。

          还可以看看上面提到的 Button 类中的onBrowserEvent 实现,因为它以您想要的类似方式处理按键事件,并解决了触发多个按键事件的问题,当您只需要生成 1 次点击事件。

          【讨论】:

            【解决方案6】:

            请注意,在 Firefox 中 KeyPressHandler 不适用于 ENTER 等特殊键,您需要使用 KeyUp 或 KeyDown

            http://code.google.com/p/google-web-toolkit/issues/detail?id=5558#c6

            【讨论】:

              【解决方案7】:

              也许ClickListenerCollection.fireClick() 会做你想做的事。不过我没用过

              抱歉,这已被弃用,甚至可能没有用。我想你应该看看 widget.delegateEvent。

              【讨论】:

                【解决方案8】:

                你可以这样做:

                focusPanel.fireEvent(new ClickEvent(){});
                

                【讨论】:

                • 'ClickEvent()' 在 'com.google.gwt.event.dom.client.ClickEvent' 中具有受保护的访问权限
                • @GlenPierce 正确,但是您没有调用其受保护的构造函数,而是创建了一个新的匿名内部类,并使用了它的构造函数。试一下代码,你会发现它编译得很好。
                猜你喜欢
                • 1970-01-01
                • 2012-03-06
                • 1970-01-01
                • 1970-01-01
                • 2023-03-27
                • 1970-01-01
                • 1970-01-01
                • 2011-03-03
                • 2015-04-28
                相关资源
                最近更新 更多