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

Swing JTable无法同时实现字体修改、居中对齐及列宽设置问题

Swing JTable 多样式实现与列宽设置问题解决

一、解决渲染器冲突问题(多样式共存)

之前分别设置字体渲染器和居中渲染器导致覆盖,核心原因是DefaultTableCellRenderer是单实例复用,后设置的渲染器会替换之前的。正确做法是在同一个自定义渲染器中整合所有样式逻辑:

class CustomTableCellRenderer extends DefaultTableCellRenderer {
    private final Font defaultFont;
    private final Font specialRowFont;

    public CustomTableCellRenderer() {
        defaultFont = getFont();
        specialRowFont = defaultFont.deriveFont(Font.BOLD, 14); // 第二行的特殊字体
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        
        // 1. 第二行应用特殊字体(Swing行索引从0开始)
        setFont(row == 1 ? specialRowFont : defaultFont);
        
        // 2. 指定列居中对齐(示例:除第一列外所有列居中)
        setHorizontalAlignment(column == 0 ? LEFT : CENTER);
        
        // 3. 数值大于9的单元格标红背景
        if (value instanceof Number num) {
            if (num.intValue() > 9) {
                setBackground(Color.RED);
            } else {
                setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
            }
        } else {
            setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
        }
        
        return this;
    }
}

将自定义渲染器绑定到所有列:

JTable table = new JTable(yourTableModel);
for (int i = 0; i < table.getColumnCount(); i++) {
    table.getColumnModel().getColumn(i).setCellRenderer(new CustomTableCellRenderer());
}

二、解决列宽设置失效问题

列宽失效几乎都是因为JTable的自动列宽调整机制覆盖了手动设置,按以下步骤处理:

  1. 关闭自动列宽调整:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
  1. 手动设置列宽:
// 第一列宽度设为100
table.getColumnModel().getColumn(0).setPreferredWidth(100);
// 其余列宽度设为30
for (int i = 1; i < table.getColumnModel().getColumnCount(); i++) {
    table.getColumnModel().getColumn(i).setPreferredWidth(30);
}

如果需要禁止用户拖动调整列宽,可额外添加:

table.getColumnModel().getColumn(0).setResizable(false);
// 其余列按需设置是否可调整

关键注意事项

  • 所有UI操作要放在Swing事件调度线程(EDT)中执行,可通过SwingUtilities.invokeLater()包裹代码。
  • JTable必须放在JScrollPane中使用,否则列头和部分UI逻辑会异常。

内容的提问来源于stack exchange,提问作者user17565490

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:52:17