You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX TableView自定义单行行高低于25px失效及底部空白问题咨询

JavaFX TableView 自定义不同行行高解决方案

问题根因

  1. 仅设置TableCell高度不生效:TableCell的高度受父容器TableRow约束,默认JavaFX样式对TableRow设置了最小高度、内边距,天然存在约25px的行高下限。
  2. 底部出现空白:TableRow为复用机制,原有代码未对空行(empty=true的底部填充行)设置高度,复用前序行的高度参数会导致TableView对内容总高度计算偏差,出现多余空白。

解决方法

  1. 主动取消TableRow的最小高度限制,突破25px下限
  2. 在updateItem方法中同时处理数据行和空行的高度,避免复用导致的高度错误
  3. 空行高度可根据需求设置,不需要显示多余空行时可将空行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:15:03