RequestFocus in TextField doesn't work

后端 未结 6 722
猫巷女王i
猫巷女王i 2021-02-13 01:49

I use JavaFX 2.1 and I created GUI using FXML, in the controller of this GUI I added myTextField.requestFocus();.

But I always get the focus in the other co

6条回答
  •  天涯浪人
    2021-02-13 02:22

    At the time of initialize() controls are not yet ready to handle focus.

    You can try next trick:

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

    For tricky complex applications (like Pavel_K has in the comments) you may want to repeat this routine several times and call method line next one:

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

    Note this is the undocumented approach and it may be wise to add a limit for repetitions to avoid endless loop if something changed or broke in future Java releases. Better to lose focus than a whole app. :)


    Example with the described threshold:

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

提交回复
热议问题