JavaFXで単一のキー押下を検出する問題があります。私は矢印キーを検出する必要がありますが、私はそれらのキーのいずれかを押すたびに、コードの一部が複数回呼び出されています。 AnimationTimer()
がループなので、これが理由ですが、私は単一のキータップを検出する方法がわかりません。私は(同じコースの他のキーとなる)矢印ボタンを押しするとJavaFXで単一キーの押下を検出します
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import java.util.HashSet;
public class Main extends Application {
Stage window;
static Scene scene;
private static char[][] mapa = {
{'X','X','X','X','X'},
{'X','.','.','.','X'},
{'X','.','M','.','X'},
{'X','.','.','.','X'},
{'X','X','X','X','X'}
};
private final int sizeX = 16;
private final int sizeY = 16;
static HashSet<String> currentlyActiveKeys;
@Override
public void start(Stage primaryStage) throws Exception {
window = primaryStage;
window.setTitle("Hello World");
Group root = new Group();
scene = new Scene(root);
window.setScene(scene);
Canvas canvas = new Canvas(512 - 64, 256);
root.getChildren().add(canvas);
prepareActionHandlers();
GraphicsContext gc = canvas.getGraphicsContext2D();
new AnimationTimer() {
@Override
public void handle(long now) {
gc.clearRect(0,0,512,512);
for(int i = 0; i < mapa.length; i++) {
for(int j = 0; j < mapa[i].length; j++) {
if(mapa[i][j] == 'X') {
gc.setLineWidth(5);
gc.setFill(Color.RED);
gc.fillRect(sizeX + i*sizeX, sizeY + j*sizeY, sizeX, sizeY);
} else if(mapa[i][j] == '.') {
gc.setLineWidth(5);
gc.setFill(Color.GREEN);
gc.fillRect(sizeX + i*sizeX, sizeY + j*sizeY, sizeX, sizeY);
} else if(mapa[i][j] == 'M') {
gc.setLineWidth(5);
gc.setFill(Color.BLACK);
gc.fillRect(sizeX + i*sizeX, sizeY + j*sizeY, sizeX, sizeY);
}
}
}
if(currentlyActiveKeys.contains("LEFT")) {
System.out.println("left");
}
if(currentlyActiveKeys.contains("RIGHT")) {
System.out.println("right");
}
if(currentlyActiveKeys.contains("UP")) {
System.out.println("up");
}
if(currentlyActiveKeys.contains("DOWN")) {
System.out.println("down");
}
}
}.start();
window.show();
}
private static void prepareActionHandlers()
{
currentlyActiveKeys = new HashSet<String>();
scene.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event)
{
currentlyActiveKeys.add(event.getCode().toString());
}
});
scene.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event)
{
currentlyActiveKeys.remove(event.getCode().toString());
}
});
}
public static void main(String[] args) {
launch(args);
}
}
、スコープに、私は同じような結果を得ています::とにかく、ここにコードがある
down
down
down
down
down
down
これは明らかとして起こります私がボタンを押すと長く。押さなくなると印刷が終了します。私が達成したいのは、いったんボタンを押しても(どれくらい長く押さえても)、私はdown
を1回だけ得ることです。 canvas
の四角形の色を更新したいので、これが必要です。
この【関連する質問(http://stackoverflow.com/questions/29962395/how-to-write-a-keylistener-for-javafx)を助けることができる(またはではないかもしれない)。私の推測では、あなたは何か別のことをしようとしているということです。 – jewelsea
@jewelsea私はコードを編集していたし、間違ったバージョンを貼り付けていた。今すぐ 'setOnKeyPressed'があります。 – Lisek
@jewelsea矢を押すと主人公が動いていきます。私の例では、キーを押したままでも、一歩も進めるために英雄になりたいと思います。それは動作しません。ボタンを押したときに、私は複数のプリントを取得しています。 – Lisek