JavaFX:以编程方式聚焦文本字段

问题描述 投票:0回答:2

我用 JavaFX 编写了一个应用程序,它只能与键盘的箭头一起使用。 所以我在场景的舞台上阻止了 MouseEvent,并且我“听”了 KeyEvents。 我还关闭了所有节点的可聚焦性:

for(Node n : children) {
     n.setFocusTraversable(false);

现在我有一些文本字段、复选框和按钮。 我想以编程方式更改输入控件(文本字段、复选框等)的状态:例如,我想输入文本字段以编程方式编辑内容。 所以我的问题是:如何进入非焦点可遍历的文本字段? 因为 textfield.requestFocus();不再起作用,因为我将文本字段的 focustraversable 属性设置为 false。

谢谢

events focus javafx-2 textfield
2个回答
54
投票

通过以下代码:

n.setFocusTraversable(false);

...节点是不可聚焦的,而不是不可聚焦的。它仍然可以通过鼠标或编程方式聚焦。由于您阻止了鼠标事件,这里是另一个选项:

Platform.runLater(() -> textfield.requestFocus());

Scene scene = new Scene(root);

编辑:根据评论,

requestFocus
的 Javadoc 指出:

...要有资格获得焦点,节点必须是场景的一部分, 它和它的所有祖先必须是可见的,并且它不能是 禁用。 ...

所以这个方法应该在构建场景图之后调用如下:

Scene scene = new Scene(root);
textfield.requestFocus();

但是,上面的 Platform.runLater 将在最后运行,在 main 方法之后

start()
,这确保了 requestFocus 的调用将在场景图构造之后。

根据requestFocus的实现代码,可能还有其他原因


2
投票

设置.requestFocus();在初始化方法上触发 .fxml 文件加载控制器

@Override
public void initialize(URL url, ResourceBundle rb) {
/* the field defined on .fxml document  
@FXML
private TextField txtYear;
*/
txtYear.requestFocus();
}
© www.soinside.com 2019 - 2024. All rights reserved.