JTable多类型列数据模型遇ArrayStoreException问题求助
问题分析与解决方案
核心错误原因
触发java.lang.ArrayStoreException的直接原因是:你在loadRankingsTable方法中,将model.rows重新赋值为**String[][]类型的数组**,但后续addModelRow方法中试图往这个数组里存入Integer和Double对象。由于Java数组的类型是固定的,String[][]只能存储String类型元素,无法容纳其他类型的对象,因此抛出异常。
修复步骤与优化代码
1. 修正数组类型初始化
将loadRankingsTable中的数组初始化语句从String[][]改为Object[][]:
private void loadRankingsTable() { int r = 0; // 改为Object[][]类型,兼容所有数据类型 model.rows = new Object[S.getCurrentArchive().partnerCensus.size()][6]; for (String p : S.getCurrentArchive().partnerCensus) { PartnerDealFilter pf = new PartnerDealFilter(p); addModelRow(pf, p, r++); } }
2. 简化数据赋值逻辑
addModelRow中无需额外包装成strings、integers、doubles数组,直接赋值更简洁:
private void addModelRow(DealFilter f, String key, int r) { Archive a = S.getCurrentArchive().getFilteredArchive(f); Integer max = -24; Integer min = 24; Integer count = 0; for (DealNode dn : a.getDeals()) { Integer imps = dn.getIMPsVsPar(); if (imps != null) { count++; if (imps < min) min = imps; if (imps > max) max = imps; } } // 直接赋值,无需额外数组包装 model.rows[r][0] = key; model.rows[r][1] = count; model.rows[r][2] = a.getNetIMPs(); model.rows[r][3] = max; model.rows[r][4] = min; model.rows[r][5] = a.getAvgIMPs() != null ? a.getAvgIMPs() : -24.01; }
3. 更规范的TableModel使用方式(可选推荐)
直接操作rows数组属于绕过DefaultTableModel的API规范,更稳妥的方式是使用DefaultTableModel自带的addRow方法,无需手动维护rows数组:
class RankingsDataModel extends DefaultTableModel { static final String[] columnNames = { "Key", "Net IMPs", "Count", "Max IMPs", "Min IMPs", "Avg IMPs" }; static int[] widths = new int[] { 16, 16, 16, 16, 16, 16 }; public RankingsDataModel() { super(columnNames, 0); // 初始化列名,行初始为0 } @Override public Class getColumnClass(int c) { return switch(c) { case 0 -> String.class; case 5 -> Double.class; default -> Integer.class; }; } @Override public boolean isCellEditable(int row, int col) { return false; } } // 加载数据时直接用addRow private void loadRankingsTable() { model = new RankingsDataModel(); for (String p : S.getCurrentArchive().partnerCensus) { PartnerDealFilter pf = new PartnerDealFilter(p); addModelRow(pf, p); } } private void addModelRow(DealFilter f, String key) { Archive a = S.getCurrentArchive().getFilteredArchive(f); Integer max = -24; Integer min = 24; Integer count = 0; for (DealNode dn : a.getDeals()) { Integer imps = dn.getIMPsVsPar(); if (imps != null) { count++; if (imps < min) min = imps; if (imps > max) max = imps; } } // 构造一行数据并添加到模型 Object[] rowData = { key, count, a.getNetIMPs(), max, min, a.getAvgIMPs() != null ? a.getAvgIMPs() : -24.01 }; model.addRow(rowData); }
这种方式遵循Swing组件的设计规范,避免了直接操作内部数组可能带来的意外问题,同时也能自动触发表格的更新事件。
内容的提问来源于stack exchange,提问作者DrSlamm
相关产品推荐
相关产品推荐

