2016-07-18 4 views
1

Следующий код производит JFrame, содержащий JFXPanel и JPanel. Каждая из панелей содержит текстовое поле.Почему JFXPanel дает фокус TextField

JFXPanel fxPanel = new JFXPanel(); 

JPanel swingPanel = new JPanel(new FlowLayout()); 
swingPanel.add(new JTextField("Swing")); 

JPanel contentPanel = new JPanel(new BorderLayout()); 
contentPanel.add(fxPanel, BorderLayout.PAGE_START); 
contentPanel.add(swingPanel, BorderLayout.CENTER); 

JFrame frame = new JFrame("Main Frame"); 
frame.setContentPane(contentPanel); 

FlowPane root = new FlowPane(); 
root.getChildren().add(new TextField("FX")); 
Scene scene = new Scene(root); 

Platform.runLater(() -> fxPanel.setScene(scene)); 
SwingUtilities.invokeLater(() -> frame.setVisible(true)); 

Предположим, что мы начинаем с ориентированного текстового поля Swing. Тогда предположим, что я нажимаю внутри JFXPanel (но не в пределах его текстового поля). JFXPanel дает фокус на TextField.

Почему это происходит? Почему JFXPanel не сохраняет свой собственный фокус? Почему это дает текстовое поле? Как он выбирает, с какими из его компонентов следует сосредоточиться? Каков правильный способ предотвратить его сосредоточение на текстовом поле?

ответ

1

Причина: SceneJFXPanel и более близко его focusOwnerProperty.

При создании Scene он дает фокус Node, хранящимся в этом объекте.

Это из-за TextField находится в сюжетном-графике, который focus traversable только Node: должен

Указывает, является ли этот узел быть частью цикла обхода фокуса. Когда это свойство истинно, фокус может быть перемещен в этот узел и от этот Узел с использованием обычных кнопок обхода фокуса. На рабочем столе такие клавиши обычно являются TAB для перемещения фокуса вперед и SHIFT + TAB для перемещения фокус назад. Когда создается Сцена, система дает фокус на Узел, чья переменная focusTraversable является истинной и имеет право на получать фокус, если фокус не был установлен явно через вызов для запросаFocus().

В качестве решения можно добавить следующее

Platform.runLater(() -> { 
    root.setOnMouseClicked(e -> root.requestFocus()); 
}); 

Это будет фокусировать FlowPane по щелчку.

+0

Итак, вызов 'root.setFocusTraversable (true);' приведет к поведению, которое хочет OP? –

+0

@James_D, похоже, к сожалению нет. – DVarga

+0

То же самое можно сказать о ложном обращении с фокусом, или что же происходит с этим подходом? – UtterlyConfused

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

  • Нет связанных вопросов^_^