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 control.
Advertisement
Answer
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 requestFocusOrDieTrying(Node node) { Platform.runLater(() -> { if (!node.isFocused()) { node.requestFocus(); requestFocusOrDieTrying(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 ); } } ); } }