以下代码生成包含JFrame
和JFXPanel
的{{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不能保持自己的关注点?为什么要将它赋予文本字段?它如何选择重点关注哪些组件?什么是阻止它将重点放在文本字段上的正确方法?
答案 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());
});
关注点击。