JavaFX TableView自定义单行行高低于25px失效及底部空白问题咨询
JavaFX TableView 自定义不同行行高解决方案
问题根因
- 仅设置TableCell高度不生效:TableCell的高度受父容器TableRow约束,默认JavaFX样式对TableRow设置了最小高度、内边距,天然存在约25px的行高下限。
- 底部出现空白:TableRow为复用机制,原有代码未对空行(
empty=true的底部填充行)设置高度,复用前序行的高度参数会导致TableView对内容总高度计算偏差,出现多余空白。
解决方法
- 主动取消TableRow的最小高度限制,突破25px下限
- 在
updateItem方法中同时处理数据行和空行的高度,避免复用导致的高度错误 - 空行高度可根据需求设置,不需要显示多余空行时可将空行prefHeight设为0
可运行修正代码
import java.util.stream.IntStream; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.stage.Stage; public class TableCellTestFix extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { int numCols = 20; int numRows = 20; ObservableList<Integer> rows = FXCollections.observableList(IntStream.rangeClosed(1, numRows).boxed().toList()); TableView<Integer> tv = new TableView<>(rows); for (int i = 0; i < numCols; i++) { TableColumn<Integer, String> col = new TableColumn<>("列" + (i+1)); int ii = i; col.setCellValueFactory(cdf -> new SimpleStringProperty(String.valueOf(ii))); tv.getColumns().add(col); } tv.setRowFactory(tview -> new TableRow<Integer>() { { // 取消行默认最小高度限制,突破25px下限 setMinHeight(0); } @Override public void updateItem(Integer item, boolean empty) { super.updateItem(item, empty); if (empty || item == null) { // 空填充行高度设置,不需要显示可设为0 setPrefHeight(25); } else if (item < 10) { setPrefHeight(15); } else { setPrefHeight(25); } } }); Scene scene = new Scene(tv, 900, 600); stage.setScene(scene); stage.show(); } }
效果说明
上述代码可实现前10行高度为15px,其余行高度为25px,底部无多余空白,拖动列重排也不会出现高度异常。如果修改行高规则后仍有布局偏差,可调用tv.refresh()强制刷新表格布局。
内容的提问来源于stack exchange,提问作者RainerMtb
相关产品推荐
相关产品推荐

