【JavaFX】マウス入力を検出

2018年1月13日

本稿ではJavaFXでマウス検出する方法を確認しておきます。

マウス操作系のゲームを作成する場合は必要な機能です。

swingよりも簡単なので紹介するまでもない気もしますが・・・

1.マウスイベントの検出

イベントの設定はSceneクラスのsetOnMouse~メソッドを呼び出します。

このメソッドの引数はEventHandlerであり、実装すべきメソッドはhandleメソッドのみのFanctionalInterfaceです。

ラムダ式が使用できますね。

ここではゲームで使うかもしれないマウスイベントのみラムダ式で検出してみます。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Test extends Application{

	@Override
	public void start(Stage primaryStage) throws Exception {
		Scene scene = new Scene(new Group(), 400, 300);
		primaryStage.setScene(scene);
		primaryStage.show();


		//マウス操作を検出
		scene.setOnMouseClicked(e -> System.out.println("マウスがクリックされました。"));
		scene.setOnMouseDragged(e -> System.out.println("マウスがドラッグされました。"));
		scene.setOnMousePressed(e -> System.out.println("マウスボタンが押し下げられました。"));
		scene.setOnMouseReleased(e -> System.out.println("マウスボタンが離されました。"));
		scene.setOnMouseMoved(e -> System.out.println("マウスが移動されました。"));
	}
}
実行結果

マウスが移動されました。
マウスボタンが押し下げられました。
マウスボタンが離されました。
マウスがクリックされました。
マウスボタンが押し下げられました。
マウスがドラッグされました。

表示したウィンドウをクリックしたり動かしたりすると上記のような結果が得られるはずです。

各種イベントの検出はSystem.outで表示したsetOnMouse~メソッドで設定できますのでクリックしたときのイベントだけでよければsetOnMouseClickedメソッドだけ設定しておけば良いです。

2.マウスイベント発生時の座標を取得

イベントメソッドの引数で渡されてくるMouseEventオブジェクトには、そのイベントが発生したときの座標を取得することができます。

MouseEventオブジェクト.getX()やMouseEventオブジェクト.getY()で取得できます。

それでは試しにマウスのクリック座標を取得してみましょう。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class Test extends Application{

	@Override
	public void start(Stage primaryStage) throws Exception {
		Scene scene = new Scene(new Group(), 400, 300);
		primaryStage.setScene(scene);
		primaryStage.show();


		scene.setOnMouseClicked(this::mouseClicked);
	}

	//マウスクリックを検出
	private void mouseClicked(MouseEvent e) {
		System.out.println("X="+e.getX()+"::Y="+e.getY());
	}
}
実行結果

X=146.0::Y=127.0
X=115.0::Y=197.0
X=85.0::Y=273.0

実際に表示したウィンドウでマウスクリックをすると上記のようにクリックしたときの座標が表示できるはずです。

3.マウスボタンを検出

MouseEventのgetButtonメソッドを利用すると、マウスのどのボタンを操作したかを検出できます。

また、getClickCountメソッドを利用すると素早くクリックした回数を取得できます。

それでは実際に左クリック、右クリック、マウスホイールクリックを検出してみましょう。


import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class Test extends Application{

	@Override
	public void start(Stage primaryStage) throws Exception {
		Scene scene = new Scene(new Group(), 400, 300);
		primaryStage.setScene(scene);
		primaryStage.show();


		scene.setOnMouseClicked(this::mouseClicked);
	}

	//マウスクリックを検出
	private void mouseClicked(MouseEvent e) {

		switch(e.getButton()) {
		case PRIMARY:
			if ( e.getClickCount() == 2 ) {
				System.out.println("左ダブルクリックを検出しました。");
			}
			System.out.println("左クリックを検出しました。");
			break;
		case SECONDARY:
			if ( e.getClickCount() == 2 ) {
				System.out.println("右ダブルクリックを検出しました。");
			}
			System.out.println("右クリックを検出しました。");
			break;
		case MIDDLE:
			if ( e.getClickCount() == 2 ) {
				System.out.println("マウスホイールダブルクリックを検出しました。");
			}
			System.out.println("マウスホイールクリックを検出しました。");
			break;
		default:
			break;
		}
	}
}
実行結果

マウスホイールクリックを検出しました。
右クリックを検出しました。
左クリックを検出しました。
左ダブルクリックを検出しました。
左クリックを検出しました。

JavaJavaFX

Posted by nompor