生成Swing表格行时出现java.lang.ArrayIndexOutOfBoundsException异常求助
Swing表格无法显示行且抛出数组越界异常的解决方法
问题背景
我已经搜索了好几个小时,试过的解决方案都没用。我需要为项目生成一个6列、约40行的表格,但在Swing GUI中运行代码时表格没有显示行。每行数据包含String、Double类型,最后一列是Panel。
报错信息
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 26 > 0
存在问题的代码
public void generateRows() { setRowCount(0); int cont = 0; for (Object obj : productos) { addRow(obtenerAtributosProducto((ProductoComida) obj)); cont++; } setRowCount(cont); } private Object[] obtenerAtributosProducto(ProductoComida producto) { /* *属性获取顺序: "Id", "Nombre", * "Precio", "Marca" * , "Calificación" * */ rowData[0] = producto.obtenerId().toString(); rowData[1] = producto.obtenerNombre(); rowData[2] = producto.obtenerPrecio(); rowData[3] = producto.obtenerMarca(); rowData[4] = producto.obtenerCalificacion(); rowData[5] = "Here is a panel"; return rowData; }
其余相关代码
public class ComprarComidaTableModel extends DefaultTableModel { private static final String[] titles = { "Id", "Nombre", "Precio", "Marca" , "Calificación", "Opciones" };//最后一列是按钮、数量和查看产品详情的区域。 private Inventario inventario = new Inventario();; private Object[] productos; private String filtro; private Object[] rowData = new Object[6]; public ComprarComidaTableModel() { super(0, 0); this.productos = inventario.obtenerCatComida().obtenerProductos(); generateColumns(); generateRows(); //这个方法出问题了 this.filtro = "Ninguno"; }
问题分析与解决方案
问题根源
- 数组复用导致数据覆盖与索引异常:
obtenerAtributosProducto方法复用了类成员变量rowData,所有行都指向同一个数组对象。DefaultTableModel处理行数据时,后续对数组的修改会覆盖之前的行数据,同时内部索引计算混乱,触发ArrayIndexOutOfBoundsException。 - 多余的行计数设置:
generateRows中循环调用addRow已经会自动增加行计数,末尾的setRowCount(cont)属于冗余操作,会干扰表格模型的内部状态。 - 列初始化可能未完成:如果
generateColumns方法未正确设置列标识符,表格模型列数为0,添加行时也会引发异常。
修复步骤
- 每次生成独立的行数组:在
obtenerAtributosProducto内部创建新的数组,避免复用同一对象: - 移除冗余的行计数设置:删除
generateRows末尾的setRowCount(cont); - 确保列正确初始化:补充
generateColumns方法,设置列名。
修复后的代码示例:
public void generateRows() { setRowCount(0); for (Object obj : productos) { addRow(obtenerAtributosProducto((ProductoComida) obj)); } } private Object[] obtenerAtributosProducto(ProductoComida producto) { Object[] rowData = new Object[6]; // 每次创建新数组,避免数据覆盖 rowData[0] = producto.obtenerId().toString(); rowData[1] = producto.obtenerNombre(); rowData[2] = producto.obtenerPrecio(); rowData[3] = producto.obtenerMarca(); rowData[4] = producto.obtenerCalificacion(); rowData[5] = new JPanel(); // 替换为实际的Panel对象 return rowData; } // 补充列初始化方法 private void generateColumns() { setColumnIdentifiers(titles); }
额外注意事项
Swing表格默认渲染器不会直接显示Panel,若需要在单元格中渲染可交互的Panel,需为最后一列自定义TableCellRenderer和TableCellEditor,否则单元格只会显示Panel的toString()结果。
内容的提问来源于stack exchange,提问作者DaSe
相关产品推荐
相关产品推荐

