如何将JavaFX TableView的大小限制为所需大小?

6
我正在编写一个简单的问卷应用程序。我正在使用TableView作为自定义JavaFX组件(代表一个问题)内的ListView中的ListCell。
我的要求是:每个ListCell在显示其全部内容的同时尽可能占用最少的空间。
但实际情况是:TableView似乎默认了标准大小。如果Table有更多的内容,它会在ScrollPane内显示其内容。如果TableView没有足够的内容,它会填充自己的空白处。
我试图以多种方式解决这个问题:
1. 最初我认为一定有一种方法可以停用滚动条。但我找不到任何方法来实现它。
2. 然后我尝试通过更改PreferredSizeProperty来改变表格的大小: table.setPrefHeight() 但我无法找到任何有关表格大小的信息。 table.setPrefHeight(USE_COMPUTED_SIZE)并没有带来我所期望的结果。
3. 接着我试图自己计算必要的高度,但我无法找到确定行高度的方法。在自定义TableCell的update方法中调用this.getTableRow().getHeight()会导致NullPointerExceptions。即使检查null,它也仍然返回0! TableRow tr = this.getTableRow(); if (tr != null) { System.out.println(tr.getHeight()); }
4. 非常沮丧的是,我决定通过调用table.setFixedCellSize(20)来固定行高。这严重限制了自定义TableCell的用途,但我无法以其他方式取得任何进展。然而,表格的高度也不等于行数乘以固定行高,因为必须考虑表头。我无法访问表头或询问表头大小/高度。
你有什么建议吗?或者告诉我在实现我的最初目标(拥有一个ListCell,它恰好占用足够的空间来显示表格的每一行,但不会留下任何空行)时遗漏了哪些内容或者做错了什么?任何帮助/想法都将不胜感激!谢谢!

所以你把这些东西塞在一起了:ListView -> ListCell -> TableView?这做法有很多错误之处,我不知道该从哪里开始说起。我强烈建议您使用不同的组件重写UI。ListView和TableView都是用于显示大量数据并以虚拟方式布局其子元素(单元格)的,而不是将一个包含TableView的问题作为ListCell图形显示。 - eckig
一个问题由一个使用TableView作为子组件的自定义组件表示。 每个问题本身都是一个ListCell,要显示在ListView中。 在我的情况下,TableView并不大:它可以包含从1到10行的任何内容。我同意:对于一行来说,它似乎有点无意义,但如果需要多行,我还没有看出有什么问题。 - thorwinn
你想要做的事情可能会非常困难(如果可能的话)。TableView 不应该用于布局,这实际上是你在尝试做的事情。你是否真正需要表格视图的任何功能(可调整大小的列、可拖动的列、单击标题进行排序等)?如果不需要,最好使用布局面板(例如 GridPane)来显示单元格,而不是使用 TableView - James_D
如果不可能的话,我必须使用另一种解决方案,显然。然而,我会要求用户提供列表,例如:对于一些日期,"列出您过去5次约会的日期"或者"列出您之前居住超过一个月的所有地址以及您居住在那里的时间段"。我认为使用表格来输入这些数据是一个相当明显的选择。 - thorwinn
可能是JavaFX - 将TableView高度适应行数的重复问题。 - findusl
2个回答

1

使用Bindings(例如带有至少2行的表格视图,或大小与列表中所有项目相同的表格)可以实现此功能...

/**
 * Helper to set table height based on content 
 *
 * @param table        - the table in context
 * @param rowHeight    - the height of a single row, alternatively could use table.fixedCellSizeProperty()
 * @param headerHeight - the height of the table header
 * @param margin       - a value for the margins
 */
public void tableHeightHelper(TableView<?> table, int rowHeight, int headerHeight, int margin) {
    table.prefHeightProperty().bind(Bindings.max(2, Bindings.size(table.getItems()))
                                            .multiply(rowHeight)
                                            .add(headerHeight)
                                            .add(margin));
    table.minHeightProperty().bind(table.prefHeightProperty());
    table.maxHeightProperty().bind(table.prefHeightProperty());
}

使用侦听器或订阅列表来提供表格,表格大小将始终调整为项目。
这实际上取决于您如何自定义列表视图的单元格以及如何配置单元格工厂... 只要未设置ListView中的fixedCellProperty(),我就没有遇到过单个单元格在ListView中根据其包含的节点的大小进行调整的问题。

这个函数的调用会在什么时候发生,为什么会发生? - npskirk

-4

请看:

tableView.setColumnResizePolicy(..);

或许这可以帮助你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接