Java 使用TableView.CONSTRAINED_RESIZE_策略时TableView标题宽度错误

Java 使用TableView.CONSTRAINED_RESIZE_策略时TableView标题宽度错误,java,javafx,tableview,Java,Javafx,Tableview,这实际上是一个已知的bug,steel为JavaFX打开了一个bug报告,您可能会发现它 描述为: 当ColumnResizePolicy设置为CONSTRAINED_RESIZE_POLICY且表格中的数据不符合可用tableview的高度(垂直滚动可见)时,则标题的宽度不正确-但仅当tableview未聚焦时。当TableView获得焦点时,标题就获得了适当的宽度 问题是,我真的需要以某种方式修复它,但我找不到任何解决方法来做到这一点 我试过: refresh() 只是“跳出”和“跳进”

这实际上是一个已知的bug,steel为JavaFX打开了一个bug报告,您可能会发现它

描述为:

当ColumnResizePolicy设置为CONSTRAINED_RESIZE_POLICY且表格中的数据不符合可用tableview的高度(垂直滚动可见)时,则标题的宽度不正确-但仅当tableview未聚焦时。当TableView获得焦点时,标题就获得了适当的宽度

问题是,我真的需要以某种方式修复它,但我找不到任何解决方法来做到这一点

我试过:

refresh()
只是“跳出”和“跳进”

otherGUIObject.requestFocus();
tableView.requestFocus(); //or getSelectionModel().Select(0)    
otherGUIObject.requestFocus();

但似乎什么都不管用。有什么想法吗?
谢谢

您在正确的轨道上:您应该在
表视图上调用
requestFocus()

以下代码片段的问题(来自您的问题)

当您调用
requestFocus()
时,
节点的属性设置为
true
,但这并不意味着控件实际上集中在GUI上(布局被更新),因为它只在JavaFX应用程序线程有时间更新时才被更新。在代码段中,您连续进行了三次
requestFocus
调用:前两次将被优化,因此只执行最后一次调用(最有可能)

解决方案是在请求焦点后调用
TableView
上的方法,以确保焦点也在GUI上更新。之后,您可以将焦点设置在任何其他
节点上(在示例中,我使用了
场景
来获取当前选择的
节点
,然后在聚焦
表视图
后,我再次聚焦该
节点

示例

// 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();

我尝试了@DVarga建议的解决方案,但它对我不起作用。当我的应用程序执行table.requestFocus()和table.requestLayout()时,显然什么都没有发生。这可能是因为表格滚动条是在代码执行后添加的,因此此问题的kew正在运行@DVarga建议使用Platform.runLater()的代码,以确保在其余布局操作完成后执行焦点。我找到了两个适合我的解决方案:

例1 例2
然而,我意识到加载javafx场景后,tableview聚焦效果可以欣赏大约一秒钟。我不知道是否有更优雅的解决方案。

答案很好。谢谢!
otherGUIObject.requestFocus();
tableView.requestFocus(); //or getSelectionModel().Select(0)    
otherGUIObject.requestFocus();
// 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();
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();

        }
});