为什么requestFocus在javafx中的KeyReleased中不起作用?

时间:2018-03-12 23:04:35

标签: javafx navigation keycode

My last post

在我的上一篇文章中,感谢James回答我的问题。但是,我仍然不太明白为什么在将KeyCode.A更改为KeyCode.DOWN后,键盘焦点会转移到txt1而不是txt2?

代码对我来说非常简单。通过释放向下箭头按钮,按钮的setOnKeyReleased方法捕获这样的特定事件并调用txt2.requestFocus()方法将键盘焦点移动到文本字段txt2。除非我在这里遗漏任何内容,否则我不明白为什么焦点会转移到txt1。

任何人都有任何想法?我在Mac上测试了这段代码。

public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {

      @Override
      public void handle(ActionEvent event) {
        System.out.println("Hello World!");
      }
    });

    StackPane root = new StackPane();

    TextField txt1 = new TextField();
    TextField txt2 = new TextField();
    VBox vbox = new VBox();
    vbox.getChildren().add(btn);
    vbox.getChildren().add(txt1);
    vbox.getChildren().add(txt2);
    root.getChildren().add(vbox);

    Scene scene = new Scene(root, 300, 250);


    btn.setOnKeyReleased((KeyEvent e) ->{
      if (e.getCode() == KeyCode.DOWN) { //<---MAKES THE CHANGE FROM
                                         //KeyCode.A TO KeyCode.DOWN
        txt2.requestFocus();
      }
    });

    txt2.addEventFilter(KeyEvent.ANY, e -> {
       System.out.printf("Key event on text field: type=%s, code=%s, 
         character=%s%n", 
         e.getEventType(), e.getCode(), e.getCharacter());
    });

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();

    btn.requestFocus();
}

0 个答案:

没有答案