有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

     @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中添加文本字段,而不仅仅是在控制器中添加上述代码