使用TableView时错误的TableView标题宽度.CONSTRAINED_RESIZE_POLICY

时间:2016-07-08 10:31:08

标签: java javafx tableview

这实际上是一个已知的错误,钢铁为您打开了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);

但似乎没有任何效果。有什么想法吗? 谢谢!

2 个答案:

答案 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()的代码,以确保一旦其余的布局操作完成。我找到了两种对我有用的解决方案:

示例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场景后,可以在大约一秒钟内欣赏到tableview焦点效果。我不知道是否有更优雅的解决方案。