2013-11-18 4 views
8

Я написал приложение с JavaFX, которое будет использоваться только с помощью стрелок клавиатуры. Итак, я не допустил MouseEvent на сцене сцены, и я «слушаю» KeyEvents. я выключил фокусируемости всех узлов:JavaFX: Фокусировка текстового поля программно

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

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

Благодаря

+0

Если вы хотите программно установить значение текстового поля, вы можете просто использовать 'setText'? Если я неправильно понял ваш вопрос, не могли бы вы перефразировать, в чем проблема, что вы пробовали, а что не работает? –

+0

Я отредактировал свой вопрос и добавил, что я сделал – PacDroid

+0

@PacDroid, который вы сказали requestFocus() работает в комментарии к моему ответу ниже. Также я отредактировал свой ответ с более подробной информацией в соответствии с вашим комментарием. Вам нужно прояснить эту путаницу. –

ответ

33

По

n.setFocusTraversable(false); 

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

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

Однако Platform.runLater в выше будет работать в конце, после того, как основной метод start(), который гарантирует, что запрос requestFocus будет выполнен после построения графика сцены.

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

+0

Хорошо, я протестировал его. Почему это не работает с простым текстовым полем. RequestFocus(); в конце моей родительской конструкции? – PacDroid

+0

@PacDroid см. Обновление. –

+0

Спасибо, что теперь я понятнее :) Я думаю, что создам свои собственные элементы управления, которые могут быть сфокусированы только методом, изменяющим их визуальные состояния. Спасибо – PacDroid

1

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

Смежные вопросы