JavaFXでマウスホイールを使ってのズームインズームアウトは可能か?

JavaFX

Twitter で面白そうなネタを見つけたので JavaFX で可能か?

どうすればいいのか?

MouseWheelEventクラスってあったけ?と疑問に思いつぶやいたところお忙しい中 @skrb さんから可能だと教えてもらいました。

もともとは「MouseWheelEventクラスってあったけ?」と大ボケをかましていたので話にならないのですが・・・ (^_^;)

そこで ImageView で試してみました。

ちなみに ScrollEvent を使うので MouseWheelEventクラスなんてものは存在しません。

ただし、タッチインタフェースのジェスチャーにも対応しているとのことで先月頭を悩ませた問題が再び襲ってくるのかと一抹の不安が脳裏を横切りました。

これも後で試してみます。

まずは ImageView で!

TilePane にImageView を二つ並べてマウスホイールで左だけ拡大縮小できるようにしてみました。

Ctrl キー、 Shift キーそれぞれを押しながらホイール操作した場合は拡大縮小比率を変更するようなおまけも付加しました。

このプログラムを実行すると下図のようにホイールで操作が可能となりました。

1

2

3

 

ただ、不可解なことに Shift キーを押しながらの処理が機能しませんでした。

Ctrl キーは問題なく機能します。

随分悩んだのですが違う PC で実行すると何の問題もない。

キーボードの設定か何かだろうか?

ちなみにスクロール量は OS 側のマウスの設定で変わってきます。

スクロールの向きも OS 側の設定になるようです。(当たり前か・・)

ではこれからが本題です。

BOX 3D オブジェクトを表示させるプログラムを組んでみます。

マウスドラッグで BOX 3D オブジェクトをグリグリさせるようにします。

そこで BOX 3D オブジェクト とカメラの距離をマウスホイールで変更させます。(カメラを移動)

ここで大きな問題が発生します。

今時の PC はタッチパネル対応の OS が搭載されてきてます。

JavaFX も Swing では無かったタッチインタフェースが標準で用意されています。

タッチドラッグによって BOX 3D オブジェクトをグリグリ動かすことができます。

つまり、マウスホイールだけでなくタッチによるスクロールまで発生してしまいます。

タッチによるスクロール、タッチによるドラッグ  あれれ、これじゃグリグリしながら拡大縮小してしまうじゃん。

どうしたものか悩んだ末に次のようなプログラムを組みました。

これでいいのかどうかは解りません。

だってタッチインタフェース使った記事って少ないしましてや 3D となると尚更ですから。

タッチカウントと慣性スクロールイベントで拡大縮小処理を行うかどうか判断させています。

box.setOnScroll(sc -> {

    if (sc.getTouchCount() == 0 && !sc.isInertia()) {

        double x = sc.getX();
        double y = sc.getY();
        double scaleBase = sc.isControlDown() ? 10.0 : sc.isShiftDown() ? 5.0 : 1.0;
        scale += (sc.getDeltaY() / 1_000) * scaleBase;
    }

    cam.setTranslateZ(zPos.doubleValue() * scale);

});

この方法しか思いつかなかった。(>_<。)

正しい方法をご存じでしたら教えてください!

ちなみにこのプログラムの実行結果は次のようになります。

4

5

 

とりあえずマウスホイール使えてめでたし!めでたし!

JavaFX おもしろいね!

Hatena タグ: