我在使用FXML和keyPress事件处理器时遇到了问题。
我尝试设置一个简单的按键事件处理器,但是该处理器并没有被调用。鼠标事件处理等都能够正确处理,但是按键事件处理却不能。
我曾经在Pane、Pane中的circle以及scene上设置过按键事件处理器。
public class Controller implements Initializable {
public Pane canvas;
public Label yDisplay;
public Label xDisplay;
public Circle circle;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
canvas.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
System.out.println("Test");
}
});
}
}
尊敬的Dil,谢谢您的回答,但我想做一些“游戏”,在屏幕上有一个简单的圆圈,通过按键盘上的按键移动。当然,要关注组件才能工作。但是没有焦点。也许键监听器必须设置在窗口或场景上?对于目的的模糊性,我深感歉意。
我尝试在按下时设置,但场景在初始化时为空。
public class Controller implements Initializable {
@FXML private Pane canvas;
@FXML private Label yDisplay;
@FXML private Label xDisplay;
@FXML private Circle circle;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
canvas.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
System.out.println("Work");
}
});
canvas.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
canvas.getChildren().add(new Bullet(150.0, 150.0, mouseEvent.getX(), mouseEvent.getY()));
}
});
}
}
这是一个逻辑问题,我尝试在Application类中设置键处理程序。将键处理程序设置在Application上可以实现,但如何获取场景中的Circle和其他组件,因为它们保存在controller.class中。
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root));
primaryStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
System.out.println("HEY");
}
});
primaryStage.show();
}
现在我试图通过查找场景/父根来完成它。
是的!查找父级是有效的。我只需要通过# +“id”进行搜索即可。
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root));
primaryStage.getScene().setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent keyEvent) {
System.out.println("HEY");
Circle myCirecle = (Circle) root.lookup("#circle");
myCirecle.setTranslateY(10.0);
}
});
primaryStage.show();
}