JavaFXKeyEvent未触发
我正在尝试使用JavaFX创建一个GUI环境(仍处于非常早期的阶段),我已经实现了EventHandler,MouseEvent工作正常,但是KeyEvent似乎由于某些原因无法工作。我已经在构造函数中调用了setOnKeyPressed、setOnKeyTyped等,所以理论上它应该可以工作。 但我看不出到底是什么导致了这个问题 GUI.javaJavaFXKeyEvent未触发,java,javafx,keyevent,eventhandler,Java,Javafx,Keyevent,Eventhandler,我正在尝试使用JavaFX创建一个GUI环境(仍处于非常早期的阶段),我已经实现了EventHandler,MouseEvent工作正常,但是KeyEvent似乎由于某些原因无法工作。我已经在构造函数中调用了setOnKeyPressed、setOnKeyTyped等,所以理论上它应该可以工作。 但我看不出到底是什么导致了这个问题 GUI.java import javafx.event.Event; import javafx.event.EventHandler; import javafx
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;
}
}
场景接收事件。你能试试这个吗
getScene().setOnKeyPressed(this);
正如@Francis Fredrick Valero所说,这个场景就是接收这些关键事件的场景 在main->start方法中,您可以执行以下操作:
primaryStage.setTitle("My GUI");
Scene scene = new Scene(arena);
scene.setOnKeyPressed(arena);
primaryStage.setScene(scene);
primaryStage.show();
这是行不通的,因为当你创建GUI实例时,场景还没有被创建谢谢,它现在对我起作用了。我应该早点注意到,因为我后来意识到,在Swing中,keylistener是在JFrame上实现的,而不是在JPanel上实现的。因此在JavaFX中应该是相同的。谢谢你的帮助!
primaryStage.setTitle("My GUI");
Scene scene = new Scene(arena);
scene.setOnKeyPressed(arena);
primaryStage.setScene(scene);
primaryStage.show();