JavaFX: программная фокусировка текстового поля

Я написал приложение с JavaFX, которое будет использоваться только со стрелками клавиатуры. Поэтому я предотвратил MouseEvent на сцене сцены, и я "слушаю" KeyEvents. Я также отключил фокусируемость всех узлов:

for(Node n : children) {
     n.setFocusTraversable(false);

теперь у меня есть некоторые текстовые поля, флажки и кнопки. Я хотел бы изменить состояние моих элементов управления вводом (textfield, checkbox,..) программно: например, я хотел бы ввести текстовое поле для программного редактирования содержимого. Итак, мой вопрос:: как войти в фокус-проходимый в textfield? Потому что textfield.requestFocus (); больше не работает, так как я установил false в свойство focustraversable моего текстового поля.

спасибо

2 ответов


By

n.setFocusTraversable(false);

узел сделан non-focus-traversable вместо non-focusable. Он все еще может быть сфокусирован, например, мышью или программно. Поскольку вы предотвратили события мыши, здесь другой вариант:

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        textfield.requestFocus();
    }
});

Scene scene = new Scene(root);

EDIT: согласно комментарию,
Документация javadoc в размере requestFocus гласит:

... Чтобы иметь право на получение фокуса, узел должен быть частью сцены, оно и все его предки должны быть видимы, и оно должно быть не быть нетрудоспособный. ...

таким образом, этот метод должен быть вызван после построения графика сцены следующим образом:

Scene scene = new Scene(root);
textfield.requestFocus();
Платформы.runLater выше будет работать в конце, после основного метода start(), которая обеспечивает вызов requestFocus будет после сцены график строительство.

возможно, есть и другие причины в зависимости от кода реализации requestFocus.


установить .requestFocus (); при инициализации метода для запуска.контроллер загрузки файлов fxml

@Override
public void initialize(URL url, ResourceBundle rb) {
/* the field defined on .fxml document  
@FXML
private TextField txtYear;
*/
txtYear.requestFocus();
}