2013-03-26 4 views
0

Задача:
Имейте вкладки tabPane OK.
На первой вкладке есть текстовое поле. При запуске приложения я могу сосредоточиться на этом поле. После изменения вкладок и возврата к первой вкладке я хочу, чтобы фокус был на этом текстовом поле (barcodereader должен быть активным в этом поле) без необходимости выбирать поле с помощью мыши.javafx setFocus after tabPaine change

Я могу поймать событие из вкладок с

tp.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() 
    { etc 

(не мог отправить с кодом)

и я могу вызвать ан события для первой вкладки. Но field.requestFocus(); не работает. Вероятно, потому, что этот метод приходит перед рендерингом текстового поля.

Так вот мой вопрос:

Как установить фокус на элемент управления после нажатия вкладки в TabPane?

+1

ли обертывание [requestFocus] (http://docs.oracle.com/ javafx/2/api/javafx/scene/Node.html # requestFocus% 28% 29) вызвать [Platform.runLater] (http://docs.oracle.com/javafx/2/api/javafx/application/Platform. html # runLater% 28java.lang.Runnable% 29) исправить вашу проблему? – jewelsea

+0

Я [открыл вопрос] (https://javafx-jira.kenai.com/browse/RT-35765) за это вы можете смотреть и голосовать. –

ответ

1

Если обрабатывать событие отпускания мыши, это работает: (. DoFocus позволяет requestFocus обработку только тогда, когда выбор вкладки изменяется до, в противном случае он пинает в каждый раз, когда вы щелкаете где-нибудь в TabPane)

final SimpleBooleanProperty doFocus = new SimpleBooleanProperty(false); 
    tabPane.setOnMouseReleased(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 
      if (!doFocus.get()) { 
       return; 
      } 
      doFocus.set(false); 
      switch (tabPane.selectionModelProperty().getValue().selectedIndexProperty().intValue()) { 
      case 0: tf1b.requestFocus(); break; 
      case 1: tf2a.requestFocus(); break; 
      default: break; 
      } 
     } 
    }); 
    tabPane.selectionModelProperty().getValue().selectedIndexProperty().addListener(new ChangeListener<Number>() { 
     @Override 
     public void changed(ObservableValue<? extends Number> observable, 
       Number oldValue, Number newValue) { 
      doFocus.set(true); 
     } 
    }); 

Когда TabPane имеет фокус, можно изменить вкладку с помощью клавиш курсора, и там TextFields также не будут получать фокус с помощью подхода на основе выбора. Возможно, это тоже нужно обработать, если вам это нужно.

(В последнее время у меня была аналогичная проблема. Я заметил, что TabPane сразу же переводит вкладки, когда вы нажимаете кнопку мыши. Я предполагаю, что запросы на основе подхода на основе выбора фокусируются на TextField сразу после мыши, но Продолжающаяся мышь вниз переводит фокус обратно в TabPane. Или, возможно, даже одно событие мыши, которое меняет выбор, заставляет фокус вернуться к TabPane. Однако мои предположения относительно причин могут быть неверными, поскольку я новичок в JavaFX .)

EDIT: Это обращение, конечно, не оптимально. Например, если вы измените вкладки с помощью клавиш, функция doFocus будет включена, а затем щелчок в любом месте TabPane вызовет вызов requestFocus. Я думал, что это нужно упомянуть.

+0

Спасибо! Это хорошая идея! Он не работает при использовании стрелок для изменения вкладок, но для этого вам нужно сдвинуть вкладку (ключ) назад, чтобы сфокусировать вкладку выше, а затем вы в любом случае, и можете легко перейти к тикстфилду. Так что еще раз спасибо! –

0

Кроме того, обратите внимание на мое решение для установки фокуса на TextArea, когда пользователь изменяет выбранный вкладку (с помощью мыши или клавиатуры) https://stackoverflow.com/a/19046535/2791746

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