我想将焦点设置为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,我无法弄清楚是什么)。如果我在调试器中单步执行此代码,它将按预期工作,因此它似乎是竞争条件。如果是这样,怎么解决?
答案 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();