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

生成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";

}

问题分析与解决方案

问题根源

  1. 数组复用导致数据覆盖与索引异常:obtenerAtributosProducto方法复用了类成员变量rowData,所有行都指向同一个数组对象。DefaultTableModel处理行数据时,后续对数组的修改会覆盖之前的行数据,同时内部索引计算混乱,触发ArrayIndexOutOfBoundsException。
  2. 多余的行计数设置:generateRows中循环调用addRow已经会自动增加行计数,末尾的setRowCount(cont)属于冗余操作,会干扰表格模型的内部状态。
  3. 列初始化可能未完成:如果generateColumns方法未正确设置列标识符,表格模型列数为0,添加行时也会引发异常。

修复步骤

  1. 每次生成独立的行数组:在obtenerAtributosProducto内部创建新的数组,避免复用同一对象:
  2. 移除冗余的行计数设置:删除generateRows末尾的setRowCount(cont);
  3. 确保列正确初始化:补充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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:37