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