我想设置JavaFx TableView的大小,以便所有行都可见,而无需滚动。即,TableView不应大于或小于显示所有行而不滚动所需的任何大小。我使用自定义TableCellFactory来调整行的高度,因为一些单元格将包含文本,因此并非所有行都具有相同的高度。
我首先尝试在自定义TableCellFactory中将TableRow添加到集合中,然后创建一个getTableHeight方法,可以调用该方法来确定所有行的总高度。但是,似乎正在发生的事情是,只有最初可见的行才会添加到集合中,而不是所有行,因此高度计算不会正确显示。
还有更好的方法吗?
public class FormattedTableCellFactory<S, String> implements Callback<TableColumn<S, String>, TableCell<S, String>> {
public FormattedTableCellFactory() {
}
protected Set<TableRow> tableRowSet = new HashSet<>();
public double getTableHeight() {
double total = 0;
Iterator<TableRow> iterator = tableRowSet.iterator();
while( iterator.hasNext() ) {
double height = iterator.next().getHeight();
total += height;
}
return total;
}
/**
* set Tooltip and enable WordWrap for Description column
* @param p
* @return
*/
@Override
public TableCell<S, String> call(TableColumn<S, String> p) {
TableCell<S, String> cell = new TableCell<S, String>() {
{
tableRowSet.add(this.getTableRow() );
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
Tooltip tooltip = new Tooltip(item.toString());
this.setText(item.toString());
setTooltip(tooltip);
Text text = new Text(item.toString());
text.wrappingWidthProperty().bind(widthProperty());
text.textProperty().bind(textProperty());
this.setWrapText(true);
this.setGraphic(text);
this.setAlignment(Pos.TOP_LEFT);
this.setHeight(text.getWrappingWidth());
} else {
this.setText(null);
}
}
};
return cell;
}
}