下面的代码生成一个JFrame,其中包含JFXPanel和JPanel。每个面板都包含一个文本字段。
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不保持它自己的焦点?为什么要把它交给文本字段呢?它如何选择要关注的组件中的哪一个?有什么正确的方法来防止它把焦点放在文本字段上呢?
发布于 2016-07-18 14:22:16
其原因是Scene of JFXPanel,更接近于它的focusOwnerProperty。
创建Scene时,它会将焦点分配给存储在此属性中的Node。
这是因为TextField是场景图中唯一的Node,也就是聚焦可穿越。
指定此节点是否应是焦点遍历周期的一部分。当此属性为真时,可以使用常规焦点遍历键将焦点移到此节点,并从此节点移出焦点。在桌面上,这类键通常是用于向前移动焦点的TAB键和用于向后移动焦点的SHIFT+TAB键。创建场景时,系统将焦点分配给focusTraversable变量为真且有资格接收焦点的节点,除非通过调用requestFocus().显式地设置焦点。
作为解决方案,您可以添加以下内容
Platform.runLater(() -> {
root.setOnMouseClicked(e -> root.requestFocus());
});这将使FlowPane集中在单击上。
https://stackoverflow.com/questions/38438207
复制相似问题