如何在JavaFX中选择选项卡更改时关注特定节点?

时间:2013-12-15 11:36:46

标签: java javafx-2

我想将焦点设置为Tab内容中的特定节点。我将 ChangeListener 添加到 selectedItem 属性,如下所示(假设该类包含名为 secondNode 的字段节点 ):

tabPane.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Tab>() {
    @Override
    public void changed(ObservableValue<? extends Tab> observable, Tab oldValue, Tab newValue) {
        if (newValue != null) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    secondNode.requestFocus();
                }
            });
        }
    }
});

然而,这不起作用。我假设原因是因为TabPane在选择了新选项卡后执行了一些影响焦点的其他操作(但是,查看TabPane source code,我无法弄清楚是什么)。如果我在调试器中单步执行此代码,它将按预期工作,因此它似乎是竞争条件。如果是这样,怎么解决?

1 个答案:

答案 0 :(得分:0)

您可以尝试使用任务替换Runnable:

        new Thread( new Task<Void>() 
        {
            @Override
            public Void call() throws Exception // This is NOT on FX thread 
            {
                Thread.sleep(100);
                return null;
            }

            @Override
            public void succeeded()  // This is called on FX thread.
            {
                secondNode.requestFocus();
            }

        }).start();