0

誰かがマウスホイールをスクロールすると値が変わるTextBoxを作成しようとしています。具体的には、上にスクロールするとテキストボックスの数値が増え、下にスクロールすると減少することが目標です。ただし、MouseWheelHandlerを理解するのに問題があります。値を「UP」または「DOWN」に変更するようにコードを簡略化しましたが、機能しません。ただし、コンパイルされます。event.preventDefault()でも試してみましたが、効果がなかったようです。

private TextBox valueField = new TextBox();
...
...
valueField.addMouseWheelHandler(new MouseWheelHandler() {
   public void onMouseWheel(MouseWheelEvent event) {
      //event.preventDefault();
      if(event.isNorth()) {
         valueField.setText("UP");
      } else {
         valueField.setText("DOWN");
      }
   }
});

編集: ChromiumとOperaでテストしたところ、問題なく動作しました。残念ながら、サポートされているブラウザ(FirefoxおよびIE)ではまだ機能しません。

編集:ネイティブJavascriptメソッドを試すことにしました。私のJavascriptスキルは弱いので、まだ助けが必要です。

4

2 に答える 2

0

この問題をネイティブのJavascriptメソッドで解決しようと思います。私はこれを機能させました。

private static native void addNativeMouseWheelListener(String id) /*-{
    function scrollWheelMove (e) {
        if ($wnd.event || $wnd.Event) {
            if (!e) e = $wnd.event;
            if (e.wheelDelta <= 0 || e.detail > 0 ) {
                $wnd.alert("DOWN");
            } else {
                $wnd.alert("UP");
            }
        }
    }

    //var box=$doc.getElementById(id);
    $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
}-*/;

今、私はDOMMouseScrollリスナーを要素自体に追加する方法を探しています。これは可能ですか、それともユーザーが要素の上にマウスを置くたびにウィンドウのDOMMouseScrollリスナーを作成する必要がありますか?また、ウィンドウがスクロールしないようにするにはどうすればよいですか?

于 2009-06-11T14:41:17.723 に答える
0

テキストボックスがマウスオーバーイベントを発生させたときにウィンドウにマウスホイールリスナーを追加するネイティブメソッドを使用して、Firefoxでこれを正常に実行しました。

protected void onAttach() {
    super.onAttach();
    String fieldId = "box"+Random.nextInt(10000);
    valueField.getElement().setId(fieldId);
    addNativeMouseWheelListener(this, fieldId);
}
...
private native void addNativeMouseWheelListener(ValueBox instance, String id) /*-{
    function mouseOverHandler(e) {
        $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function mouseOutHandler(e) {
        $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function scrollWheelMove(e) {
        e.preventDefault();
        if (e.wheelDelta <= 0 || e.detail > 0 ) {
            instance.@com.proprintsgear.design_lab.client.ValueBox::decreaseValue()();
        } else {
            instance.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
        }
        instance.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
    }

    if($wnd.addEventListener) {
        var box=$doc.getElementById(id);
        box.addEventListener("mouseout",mouseOutHandler,false);
        box.addEventListener("mouseover",mouseOverHandler,false);
    }
}-*/;

このメソッドを書いた直後に、GWTの最新のsvnリビジョンがFirefoxのMouseWheelEventを修正したことを知りました。しかし、私はすでにこれを書いています、そして私は不安定なリリースをダウンロードする気がないので、次の安定したGWTリリースまでこれを保持します。

于 2009-06-12T13:06:00.237 に答える