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的自动列宽调整机制覆盖了手动设置,按以下步骤处理:
- 关闭自动列宽调整:
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
- 手动设置列宽:
// 第一列宽度设为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
相关产品推荐
相关产品推荐

