我用 JavaFX 编写了一个应用程序,它只能与键盘的箭头一起使用。 所以我在Scene的舞台上阻止了MouseEvent,并“监听”KeyEvents。 我还关闭了所有节点的可聚焦性:
for(Node n : children) {
n.setFocusTraversable(false);
现在我有一些文本字段、复选框和按钮。 我想以编程方式更改输入控件(文本字段、复选框等)的状态:例如,我想输入文本字段以以编程方式编辑内容。 所以我的问题是:如何在非焦点可遍历的文本字段中输入? 因为textfield.requestFocus();自从我将文本字段的 focustraversable 属性设置为 false 以来,它不再起作用。
谢谢
最佳答案
通过以下代码:
n.setFocusTraversable(false);
...节点变为不可焦点遍历而不是不可焦点。它仍然可以通过鼠标或编程方式进行聚焦。由于您阻止了鼠标事件,因此还有另一个选项:
Platform.runLater(() -> textfield.requestFocus());
Scene scene = new Scene(root);
编辑:根据评论,
requestFocus
的 Javadoc 指出:
... To be eligible to receive the focus, the node must be part of a scene, it and all of its ancestors must be visible, and it must not be disabled. ...
因此应该在构建场景图后调用此方法,如下所示:
Scene scene = new Scene(root);
textfield.requestFocus();
但是上面的Platform.runLater会在最后运行,在主方法start()
之后,这保证了requestFocus的调用会在场景图构建之后进行。
可能还有其他原因,具体取决于 requestFocus 实现代码。
关于events - JavaFX : Focusing textfield programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20049452/