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

Java 15环境下DefaultTableCellRenderer无法识别Integer与Date类型问题

问题根因

这个问题是Java 9及以上版本Swing组件的两个行为变动导致的:

  • JTable的渲染器匹配逻辑调整:高版本Java默认会为Integer、Date等常用类型注册专属的默认渲染器,你只给Object.class注册了自定义渲染器,匹配优先级低于专属类型的渲染器,所以第2、3列不会走你写的类型判断逻辑。
  • 你设置了setAutoResizeMode(JTable.AUTO_RESIZE_OFF)关闭了列宽自动适配,Java 9之后Swing默认列宽计算逻辑有改动,你未手动设置列宽的情况下第2、3列宽度为0,不会触发渲染,所以输出里完全看不到这两列的日志。

修复方案

第一步:手动设置列宽,保证所有列正常渲染

在setModel(model)之后添加列宽配置代码:

model.setDataVector(data, arrColumnName);
setModel(model);
// 新增列宽配置
getColumnModel().getColumn(0).setPreferredWidth(100);
getColumnModel().getColumn(1).setPreferredWidth(80);
getColumnModel().getColumn(2).setPreferredWidth(120);
getColumnModel().getColumn(3).setPreferredWidth(150);

第二步:为所有需要识别的类型注册自定义渲染器

除了Object.class之外,额外给Integer和Date类型注册你的自定义渲染器,保证所有列都走你写的类型判断逻辑:

setDefaultRenderer(Object.class, tableRenderer);
// 新增专属类型渲染器注册
setDefaultRenderer(Integer.class, tableRenderer);
setDefaultRenderer(Date.class, tableRenderer);

可选优化

把getColumnClass的返回值改为带通配符的泛型类型,避免高版本Java的编译警告:

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case 2: return Integer.class;
        case 3: return Date.class;
        default: return String.class;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:39:02