这实际上是一个已知的错误,钢铁为您打开了JavaFX的错误报告 here
说明是:
当ColumnResizePolicy设置为CONSTRAINED_RESIZE_POLICY并且表的数据不适合可用的tableview的高度(垂直滚动可见)时,标题的宽度不正确 - 但仅当TableView没有聚焦时。当TableView获得焦点时,标题将获得适当的宽度。
问题是,我真的需要以某种方式解决它,但我找不到任何解决方法来做到这一点。
我试过了:
refresh()
并且只是“跳出”并进入
otherGUIObject.requestFocus();
tableView.requestFocus(); //or getSelectionModel().Select(0)
otherGUIObject.requestFocus();
也
tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
但似乎没有任何效果。有什么想法吗? 谢谢!
答案 0 :(得分:2)
您走在正确的轨道上:您应该致电requestFocus()
上的TableView
。
以下代码段的问题(来自您的问题)
otherGUIObject.requestFocus();
tableView.requestFocus(); //or getSelectionModel().Select(0)
otherGUIObject.requestFocus();
当您致电requestFocus()
时,Node
的{{3}}按预期设置为true
,但这并不意味着控件实际上已集中在GUI上(布局更新) - 因为只有在JavaFX应用程序线程有时间更新它时才会更新。在代码段中,您连续三次requestFocus
次调用:前两次将被优化,因此只执行最后一次(最有可能)。
解决方案是在请求焦点后调用TableView
上的focusedProperty方法,以确保焦点也在GUI上更新。之后,您可以将焦点设置在任何其他Node
上(在我使用Scene
的{{3}}示例中)以获取当前选择的Node
,然后在{{1}之后我已经集中注意力了,我再次关注这个TableView
。
示例强>
Node
答案 1 :(得分:1)
我尝试了@DVarga建议的解决方案,但对我不起作用。当我的应用程序执行 table.requestFocus()然后执行 table.requestLayout()时,显然没有任何反应。可能是因为在执行代码后添加了表格滚动条,因此解决此问题的原因是运行@DVarga建议使用 Platform.runLater()的代码,以确保一旦其余的布局操作完成。我找到了两种对我有用的解决方案:
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
Platform.runLater(new Runnable() {
@Override
public void run() {
tableView.refresh();
}
});
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
Platform.runLater(new Runnable() {
@Override
public void run() {
tableView.requestFocus();
}
});
但是,我意识到在加载javafx场景后,可以在大约一秒钟内欣赏到tableview焦点效果。我不知道是否有更优雅的解决方案。