web-dev-qa-db-ja.com

gwtのコードからクリックイベントを発生させる

コンポジットを拡張するカスタムウィジェットを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
                }
            }
        });

ありがとう

23
DonX

クリックイベントではこれを行っていませんが、このような変更イベントを行っています。

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)
19
DLH

私はこのコードを実行しました:

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でなければならず、別のイベントハンドラーの内部にいます。

20
Rod

簡単なJSNIメソッドを使用してそれを行うこともできます。要素を渡すだけです[例: button.getElement()]をこのメソッドに追加します。

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

ターゲットがボタンの場合は、そのclick()メソッドを呼び出すだけです。それ以外の場合は、次のようなことができます。

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

KeyPressHandlerは、Enterなどの特別なキーではFirefoxで機能しないことに注意してください。KeyUpまたはKeyDownを使用する必要があります。

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

2
Carlos Aguayo

DLHによって記述されたメソッドは機能するはずであり、詳細引数(それが何のためにあるのか私にはわかりません)を除いて、KeyPressEventで使用可能な他の引数があります。

別の可能な解決策は、要素のネイティブJavaScript click()を呼び出すことです。これはボタンウィジェットで行いました(これはオープンソースとして利用できます)。次のクラスのclick()メソッドを参照してください。 http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/Java/org/cobogw/ gwt/user/client/ui/Button.Java )は、特定のEvent2クラスを呼び出し、ブラウザー固有のバージョンのクリックメソッドを実装します。

このメソッドを使用するには、 cobogw で提供されるjarファイルをプロジェクトに追加し、_Event.gwt.xml_を含めて、メソッドにEvent2.fireClickEvent(getElement());を呼び出すか、コードのみを使用しますあなた自身のプロジェクトのクラスEvent2とEventから

このソリューションでは、プログラムでクリックイベントを発生させることもできます。

上記のButtonクラスのonBrowserEvent実装も確認してください。これは、キーイベントを同様の方法で処理し、必要な場合にのみ複数のキーイベントの発生の問題を回避するためです。 1つのクリックイベントを生成します。

2

多分 ClickListenerCollection.fireClick() はあなたが望むことをします。使ったことないけど

申し訳ありませんが、これは非推奨であり、おそらく役に立たないこともあります。代わりに、widget.delegateEventを見てください。

1
HerdplattenToni

あなたはこれを行うことができます:

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