文本字段中的请求焦点不起作用

2022-09-02 14:16:38

我使用JavaFX 2.1,并使用FXML创建了GUI,在这个GUI的控制器中,我添加了。myTextField.requestFocus();

但我总是把焦点放在另一个控件上。


答案 1

在控件尚未准备好处理焦点时。initialize()

你可以试试下一个技巧:

@Override
public void initialize(URL url, ResourceBundle rb) {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            tf.requestFocus();
        }
    });
}

对于棘手的复杂应用程序(如Pavel_K注释中),您可能需要重复此例程几次,并在下一个例程调用方法行:

private void requestFocusOrDieTrying(Node node) {
    Platform.runLater(() -> {
        if (!node.isFocused()) {
            node.requestFocus();
            requestFocusOrDieTrying(node);
        }
    });
}

请注意,这是未记录的方法,如果将来的Java版本中某些内容发生更改或中断,则为重复添加限制可能是明智的,以避免无休止的循环。比整个应用程序失去焦点更好。:)


具有所述阈值的示例:

@Override
public void requestFocus() {
  requestFocus( getNode(), 3 );
}

private void requestFocus( final Node node, final int max ) {
  if( max > 0 ) {
    runLater(
        () -> {
          if( !node.isFocused() ) {
            node.requestFocus();
            requestFocus( node, max - 1 );
          }
        }
    );
  }
}

答案 2

答案与@Sergey格里涅夫完全相同。确保您的 Java 版本是最新的(JDK 1.8 或更高版本)。

Platform.runLater(()->myTextField.requestFocus());

推荐