java JavaFX FXML控制器密钥处理程序代码不工作
我对FXML和按键处理程序有问题
我尝试设置按键简单测试,但没有调用按键处理程序。鼠标操作等工作正常,但按键操作不正常
我试图在窗格、圆圈(在窗格中)和场景上设置KeyHandler
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");
}
});
}
}
尊敬的迪尔,谢谢你的回答,但我想做一些“游戏”,在窗格上画一个简单的圆圈,按下键盘移动。当然,把重点放在薪酬上是可行的。但是没有焦点。可能关键侦听器必须设置在窗口或场景上?我为目的不明而道歉
我试图设置为按,但在初始化时,设置为空
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()));
}
});
}
}
这是逻辑,我试着在应用类中设置。在应用程序上设置密钥处理程序,就可以了!但是,如何获得圆和场景的其他组成部分,因为它们是可控的。阶级
@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();
}
# 1 楼答案
您的代码没有问题。我已经测试了这段代码,它对我来说没有任何变化。问题可能出在你的使用上。为什么要将按键侦听器添加到整个窗格而不是某些组件?除非未选择容器/窗格,否则无法识别按键。 在fxml中添加一个文本字段,如果按键被识别为如下所示
并在initialize()函数中添加以下代码
注意:您还应该在fxml中添加文本字段,而不仅仅是在控制器中添加上述代码