3

我对 FXML 和 keyPress 处理程序有疑问。

我尝试设置按键简单测试,但未调用按键处理程序。鼠标处理等工作正常,但按键处理不能。

我试图在窗格、圆圈(在窗格中)和场景上设置密钥处理程序。

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()));
            }
        });
    }
}

这是逻辑,我试图在 Apllication 类中设置。在应用程序上设置密钥处理程序,它的工作!但是,如何获取 Circle 和场景的其他组件,因为它们在 controlle.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();
    }
4

1 回答 1

5

您的代码没有问题。我已经测试了这段代码,它对我有用,没有任何改变。问题可能与您的使用有关。为什么要将 KeyPress 侦听器添加到整个窗格而不是某些组件?除非未选择容器/窗格,否则无法识别按键。如果按键被识别如下,则在 fxml 中添加一个 TextField

 @FXML
private TextField testTextField;

并在 initialize() 函数中添加以下代码

testTextField.setOnKeyPressed(new EventHandler<KeyEvent>() {

        @Override
        public void handle(KeyEvent arg0) {
            // TODO Auto-generated method stub
            System.out
                    .println("MyController.initialize().new EventHandler() {...}.handle()");

        }
    });

注意:您还应该在 fxml 中添加文本字段,而不仅仅是在控制器中添加上述代码。

于 2013-10-27T09:09:45.320 回答