おもに Groovy やアジャイル開発について勉強していることを書き散らしてます。
わたしのひとりごとが、だれかのお役に立てればと…

JavaFX でダブルクリックを検知する

JavaFX ではダブルクリックされたのをどうやって検知するんだろうと疑問に思っていたら簡単にできました。
こんな感じです。

sampleNode.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    void handle(MouseEvent event) {
        boolean doubleClicked 
            = event.getButton().equals(MouseButton.PRIMARY) \
                && event.getClickCount() == 2
        if (doubleClicked) {
            println "ダブルクリックされたよ"
        }
    }
})

sampleNode となっているものは javafx.scene.Node クラスのオブジェクトです。
Button とか、TextField とか @FXML で指定する GUI の構成要素のことです。

ダブルクリックを直接的に検知するメソッドはない

マウスでクリックされたことを検知する Node#setOnMouseClicked() があるので、Node#setOnMouseDoubleClicked() があるはずだと思ってたら世の中そんなに甘くはなかったです。そんなメソッドはないです。

MouseEvent#getClickCount() がすぐれもの

MouseEvent クラスには getClickCount() というクリック回数を返してくれるメソッドがあります。
setOnMouseClicked のイベントハンドラ内で、「クリック回数が2のときにダブルクリックとみなす」という判断をすることができます。

とはいえ、この getClickCount() メソッド。
カウンタを初期化しないと、ダブルクリックどころか延々とクリック回数が増えていって大変なことになるんじゃないかと…(ーー;)

調べてみると、優秀でした。
クリックしてしばらくするとカウンタが0に戻るようです。
安心してクリック回数を調べられます。カウンタの初期化も不要です。

左クリックのみに限定する

MouseEvent#getButton() でクリックしたマウスのボタンを MouseButton オブジェクトとして取得できます。
次のような定数がマウスボタンの種類に合わせて設定されているので、比較することでボタンを特定できます。

・MouseButton.PRIMARY(左クリック)
・MouseButton.SECONDARY(右クリック) 
※OSの設定で左右を逆にしてたら、おそらく逆になる?

まとめ

「左クリックで、かつクリック回数が2回のとき」という条件分岐を使用することで、ダブルクリックを検知できるということです。
うまいこと設計されているなと感心しました。