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
相关产品推荐
相关产品推荐

