【发布时间】:2014-10-08 16:09:56
【问题描述】:
我正在开发一个 JavaFX 客户端。它是一个两窗格的软件。左窗格是一个列表,显示了为客户端开发的几个应用程序(具有不同的布局)(Application_1、Application_2 等)。右侧窗格是显示Application_N 的位置。
显示在软件右窗格中的应用程序具有以下 java 类层次结构:
BorderPane -> Application(我开发的应用类)。
Application 类有一个 Node 属性 (Node body;) 包含一个表单,而这个表单包含一个 Field。
当应用程序在上面提到的右窗格中显示时它调用方法requestFocus(),并且该方法(从JavaFX Node类覆盖)有责任请求焦点(这次使用原始@来自 JavaFX Node 类的 987654334@ 方法)用于上述字段。
这个程序效果很好。但是,问题是当我想添加一个包含Node 正文的ScrollPane 时。似乎是ScrollPane 不允许将请求焦点方法应用于正文中的字段。
下面写的代码来自Application.java
Node body;
body = getBody(); // getBody() builds the UI of this application
scrollPanel = new ScrollPane();
scrollPanel.setHbarPolicy(ScrollBarPolicy.AS_NEEDED);
scrollPanel.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
scrollPanel.setFitToWidth(true);
scrollPanel.setFitToHeight(true);
scrollPanel.getStyleClass().add("application");
scrollPanel.setContent(body);
this.setCenter(scrollPanel);
...
现在,当要显示应用程序时,它会执行以下代码:
public void create(){
requestFocus();
}
@Override
public void requestFocus(){
accountField.requestFocus(); //using the method from the JavaFX node class
}
我重申问题正在发生当我将滚动窗格放入我的层次结构时。如果有人对此有评论或解决方案,我将不胜感激。谢谢。
【问题讨论】:
-
如果您将 requestFocus 调用包装在 Platform.runLater() 中或者使用此 task hack for delayed focus control 是否有效?
-
我已经尝试过该解决方案。在 Platform.runLater() 中包装 requestFocus 方法。然而,它只在某些时候有效。我不知道为什么。它可能与 Java FX 线程有关,但完全不确定。 @jewelsea
-
我将尝试您提供的第二个选项。谢谢。 @jewelsea
-
That task hack using Thread.sleep() 不是我的首选选项,因为它并不完全准确。你必须玩弄时间。但是,它可以工作,我会在继续研究滚动窗格(因为没有它,请求焦点在我的特定子节点上)和 Java FX 线程之间的关系时,我会接受它。谢谢。 @jewelsea
标签: java javafx focus setfocus focusable