# 表格行高列宽调整

# 方案1

增加行高:使用 setRowHeight 方法。

设置列宽:使用 getColumnModel().getColumn(i).setPreferredWidth(width) 方法。

调整表头字体:已经设置较大字体,可保持不变。

举例:在 table.setModel(...) 之后添加

table.setRowHeight(30); // 增加行高
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 关闭自动缩放

// 设置列宽
table.getColumnModel().getColumn(0).setPreferredWidth(100);
table.getColumnModel().getColumn(1).setPreferredWidth(100);
table.getColumnModel().getColumn(2).setPreferredWidth(150);

# 方案2

开启自动换行(默认 JTable 不能换行,但可以用 JTextArea 作为渲染器)。

# 步骤 1:创建自定义的单元格渲染器

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;

public class MultiLineTableCellRenderer extends JTextArea implements TableCellRenderer {

    public MultiLineTableCellRenderer() {
        setLineWrap(true); // 开启自动换行
        setWrapStyleWord(true); // 断行时按单词换行
        setOpaque(true); // 设置背景透明
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        setText(value == null ? "" : value.toString()); // 设置单元格文本
        setFont(table.getFont()); // 继承表格的字体
        
        // 根据内容调整行高
        int fontHeight = getFontMetrics(getFont()).getHeight();
        int textLength = getText().length();
        int columnWidth = table.getColumnModel().getColumn(column).getWidth();
        int lineCount = (int) Math.ceil((double) textLength * fontHeight / columnWidth);
        int rowHeight = Math.max(lineCount * fontHeight, table.getRowHeight());
        table.setRowHeight(row, rowHeight);

        return this;
    }
}

# 步骤 2:在 initTable 方法中应用该渲染器

initTable 方法中,创建 JTable 后,给所有列设置这个渲染器:

void initTable(String text) {
        String sql = "select * from tb_car";
        try {
            ResultSet set = SqlUtil.query(sql, new Object[]{text});
            table.setModel(new DefaultTableModel(SqlUtil.getSetArrays(set), headers));
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    // 设置行高和自动换行渲染器
    table.setRowHeight(30); // 基础行高
    table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); // 关闭自动缩放
    for (int i = 0; i < table.getColumnCount(); i++) {
        table.getColumnModel().getColumn(i).setPreferredWidth(150); // 适当调整列宽
        table.getColumnModel().getColumn(i).setCellRenderer(new MultiLineTableCellRenderer()); // 设置换行渲染器
    }
}