【JavaFX】キー入力を検出

2018年1月13日

本稿はJavaFXでキー入力を検出する方法を確認しておきます。

1.キー入力イベントの設定

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

このメソッドの引数は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.setOnKeyPressed(e -> System.out.println("キーが押されました。"));
		scene.setOnKeyReleased(e -> System.out.println("キーが離されました。"));
	}
}
実行結果

キーが押されました。
キーが離されました。

何かのキーを押して離すと上記のような結果が得られるはずです。

2.Enterなど特定のキーを押されたかを検出

どのキーが押されたかの検出はKeyEventオブジェクトのgetCodeメソッドを利用して判定できます。

各キーの列挙型はこちらで確認できます。例えばZキーならswitch文に「case Z」と記述することで判定できます。

それではサンプルをご覧ください。


import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.KeyEvent;
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.setOnKeyPressed(this::keyPressed);
	}

	//キー押し下げを検出
	private void keyPressed(KeyEvent e) {

		switch(e.getCode()) {
		case ENTER:
			System.out.println("Enterを押下しました。");
			break;
		case SPACE:
			System.out.println("スペースを押下しました。");
			break;
		default:
			break;
		}
	}
}
実行結果

Enterを押下しました。
スペースを押下しました。

Enterキーや、スペースキーを押下すると上記のような結果が得られるはずです。

ちなみにgetTextメソッドを利用することで押されたキーの文字を取得することもできます。タイピングゲームなどで使えるかもしれません。

まあ、普通のFXアプリケーションならTextFieldがあるから使用する必要もないか・・・

JavaJavaFX

Posted by nompor