为什么JFXPanel将焦点放在TextField上

时间:2016-07-18 13:38:04

标签: java swing javafx javafx-8 jfxpanel

以下代码生成包含JFrameJFXPanel的{​​{1}}。每个面板都包含一个文本字段。

JPanel

假设我们从聚焦的Swing文本字段开始。然后假设我在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)); 内部单击(但不在其文本字段的范围内)。 JFXPanel将焦点放在JFXPanel上。

为什么会这样?为什么JFXPanel不能保持自己的关注点?为什么要将它赋予文本字段?它如何选择重点关注哪些组件?什么是阻止它将重点放在文本字段上的正确方法?

1 个答案:

答案 0 :(得分:1)

原因是Scene的{​​{1}}更接近focusOwnerProperty

创建JFXPanel后,它会将焦点放在此属性中存储的Scene上。

这是因为Node是场景图中唯一的TextField,即focus traversable

  

指定此节点是否应成为焦点遍历循环的一部分。   当此属性为true时,可以将焦点移动到此节点并从中移动   此节点使用常规焦点遍历键。在桌面上这样的键   通常是TAB用于向前移动焦点,SHIFT + TAB用于移动   向后焦点。 创建场景时,系统会将焦点放在a上   其focusTraversable变量为true且符合条件的节点   获得焦点,除非通过呼叫明确设置焦点   requestFocus()。

作为解决方案,您可以添加以下内容

Node

这会使Platform.runLater(() -> { root.setOnMouseClicked(e -> root.requestFocus()); }); 关注点击。