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

时间:2013-11-18 13:50:49

标签: events focus javafx-2 textfield

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

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

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

由于

2 个答案:

答案 0 :(得分:45)

通过

n.setFocusTraversable(false);

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

Platform.runLater(new Runnable() {
    @Override
    public void run() {
        textfield.requestFocus();
    }
});

Scene scene = new Scene(root);

编辑:根据评论,
requestFocus状态的javadoc:

  

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

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

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

但是,上面的Platform.runLater将在主方法start()之后运行,这确保了requestFocus的调用将在场景图形结构之后。

取决于requestFocus实现代码,可能还有其他原因。

答案 1 :(得分:1)

设置.requestFocus(); on initialize方法以触发.fxml文件加载控制器

@Override
public void initialize(URL url, ResourceBundle rb) {
/* the field defined on .fxml document  
@FXML
private TextField txtYear;
*/
txtYear.requestFocus();
}