它实际上是一个已知的bug和钢铁打开了一个JavaFX的bug报告,您可以找到这里。
描述是:
当ColumnResizePolicy设置为CONSTRAINED_RESIZE_POLICY和表时,数据不适合可用的表视图的高度(垂直滚动是可见的),那么标头的宽度不正确--但只有当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);
但似乎什么都起不到作用。有什么想法吗?谢谢!
发布于 2016-07-08 03:11:45
您在正确的轨道上:您应该在requestFocus()
上调用TableView
。
以下片段的问题(来自您的问题)
otherGUIObject.requestFocus();
tableView.requestFocus(); //or getSelectionModel().Select(0)
otherGUIObject.requestFocus();
当您调用requestFocus()
时,Node
的focusedProperty按预期设置为true
,但这并不意味着控件实际上会集中在GUI上(布局被更新)--因为只有当JavaFX应用程序线程有时间更新它时才会更新。在代码段中,您将连续执行三个requestFocus
调用:前两个调用将被优化,因此只执行最后一个调用(很可能)。
解决方案是在请求焦点之后调用TableView
上的TableView
方法,以确保焦点在GUI上也被更新。之后,您可以将焦点设置在任何其他Node
上(在示例中,我已经使用focusOwnerProperty
of Scene
获取当前选择的Node
,然后在TableView
聚焦之后,我再次关注这个Node
)。
示例
// The current focus owner on the Scene
Node focusOwner = scene.getFocusOwner();
table.requestFocus();
table.requestLayout();
// Request focus on the currently focused Node
if(focusOwner != null)
focusOwner.requestFocus();
else
// request focus on any Node you want
textField.requestFocus();
发布于 2020-05-10 00:59:59
我尝试了@DVarga建议的解决方案,但它对我没有用。当我的应用程序执行table.requestFocus()和table.requestLayout()时,显然什么都没有发生。这可能是因为表滚动条是在代码执行后添加的,因此kew正在运行代码@DVarga建议使用Platform.runLater()来确保在其余布局操作完成后执行焦点。我找到了两个对我有用的解决方案:
示例1
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
Platform.runLater(new Runnable() {
@Override
public void run() {
tableView.refresh();
}
});
示例2
tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);
Platform.runLater(new Runnable() {
@Override
public void run() {
tableView.requestFocus();
}
});
但是,我意识到在javafx场景加载之后,可以在大约一秒内欣赏到平板视图的焦点效果。我不知道是否有更优雅的解决办法。
https://stackoverflow.com/questions/38264482
复制