我想創建一個使用JavaFX的GUI環境(仍處於非常早期階段),我已經實現了EventHandler,MouseEvent可以正常工作,但是KeyEvent似乎並沒有出於某種原因。我已經在構造函數中調用了setOnKeyPressed,setOnKeyTyped等,理論上它應該可以工作。 但我看不到實際導致問題的原因。JavaFX KeyEvent沒有觸發
GUI.java
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import java.util.ArrayList;
/**
* @author JAY
*/
public class GUI extends Pane implements EventHandler<Event>{
private boolean up = false;
private boolean down = false;
private boolean left = false;
private boolean right = false;
private boolean spacebar = false;
private boolean shift = false;
private boolean ctrl = false;
private double mouseX;
private double mouseY;
public GUI(int width, int height) {
super();
setStyle("-fx-background-color: black;");
setPrefSize(width, height);
ArrayList<Node> things = new ArrayList<>();
getChildren().addAll(things);
setOnKeyPressed(this);
setOnKeyTyped(this);
setOnKeyReleased(this);
setOnMouseMoved(this);
setOnMouseClicked(this);
setOnMouseDragged(this);
}
@Override
public void handle(Event event) {
System.out.println(event.getEventType().toString());
if(event instanceof KeyEvent) {
if(event.getSource() == getOnKeyPressed()) {
keyPressed((KeyEvent) event);
}
if(event.getSource() == getOnKeyReleased()) {
keyReleased((KeyEvent) event);
}
System.out.println(((KeyEvent) event).getCode());
}
if(event instanceof MouseEvent) {
if(event.getSource() == getOnMouseMoved()) {
mouseMoved((MouseEvent) event);
}
System.out.println("mouse at x: " + mouseX + " y: " + mouseY);
}
}
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
}
public void keyPressed(KeyEvent e) {
KeyCode code = e.getCode();
if (code == KeyCode.UP)
up = true;
if (code == KeyCode.DOWN)
down = true;
if (code == KeyCode.LEFT)
left = true;
if (code == KeyCode.RIGHT)
right = true;
if (code == KeyCode.SPACE)
spacebar = true;
if (code == KeyCode.SHIFT)
shift = true;
if (code == KeyCode.CONTROL)
ctrl = true;
}
public void keyReleased(KeyEvent e) {
KeyCode code = e.getCode();
if (code == KeyCode.UP)
up = false;
if (code == KeyCode.DOWN)
down = false;
if (code == KeyCode.LEFT)
left = false;
if (code == KeyCode.RIGHT)
right = false;
if (code == KeyCode.SPACE)
spacebar = false;
if (code == KeyCode.SHIFT)
shift = false;
if (code == KeyCode.CONTROL)
ctrl = false;
}
}
Main.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
/**
* @author JAY
*/
public class Main extends Application {
private GUI arena = new GUI(600, 600);
public void start(Stage primaryStage) {
primaryStage.setTitle("My GUI");
primaryStage.setScene(new Scene(arena));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
謝謝你,它工作了我現在。我應該早點注意到,因爲後來我意識到在Swing中,keylistener實現了JFrame而不是JPanel。因此在JavaFX中應該是一樣的。感謝您的幫助! –