首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么JFXPanel把焦点放在TextField上

为什么JFXPanel把焦点放在TextField上
EN

Stack Overflow用户
提问于 2016-07-18 13:38:04
回答 1查看 234关注 0票数 1

下面的代码生成一个JFrame,其中包含JFXPanelJPanel。每个面板都包含一个文本字段。

代码语言:javascript
复制
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不保持它自己的焦点?为什么要把它交给文本字段呢?它如何选择要关注的组件中的哪一个?有什么正确的方法来防止它把焦点放在文本字段上呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-18 14:22:16

其原因是Scene of JFXPanel,更接近于它的focusOwnerProperty

创建Scene时,它会将焦点分配给存储在此属性中的Node

这是因为TextField是场景图中唯一的Node,也就是聚焦可穿越

指定此节点是否应是焦点遍历周期的一部分。当此属性为真时,可以使用常规焦点遍历键将焦点移到此节点,并从此节点移出焦点。在桌面上,这类键通常是用于向前移动焦点的TAB键和用于向后移动焦点的SHIFT+TAB键。创建场景时,系统将焦点分配给focusTraversable变量为真且有资格接收焦点的节点,除非通过调用requestFocus().显式地设置焦点。

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

代码语言:javascript
复制
Platform.runLater(() -> {
    root.setOnMouseClicked(e -> root.requestFocus());
});

这将使FlowPane集中在单击上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38438207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档