我想将焦点设置到选项卡内容中的特定节点。我将ChangeListener添加到selectedItem属性中,如下所示(假定该类包含一个名为secondNode且类型为Node的字段):
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源代码查看时,我不知道是什么)。如果我在调试器中单步执行此代码,则它可以按预期工作,因此似乎是竞争条件。如果是这样,如何解决?
您可以尝试将Runnable替换为Task:
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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句