向模型添加行但不添加行。获取数组索引超出范围的异常

时间:2014-03-27 06:59:46

标签: java swing jtable tablemodel

我正在尝试创建一个包含5列并向其添加行的空表。我创建了一个扩展AbstractTableModel的单独的tablemodel类。

课程是:

public class MyTableModel extends AbstractTableModel 
 {
    private String[] columnNames = {"Name",
                                    "Size",
                                    "Directory",
                                    "Last Modified Time",
                                    "Readable"};

    Object[][] data=new Object[][]{

    };

    public int getColumnCount() 
    {
        return columnNames.length;
    }
    public String getColumnName(int col) 
    {
        return columnNames[col];
    }
    public Class getColumnClass(int c) 
    {
        return getValueAt(0, c).getClass();
    }
    public boolean isCellEditable(int row, int col) 
    {
            if (col < 1) 
        {
            return false;
        } 
        else 
        {
            return false;
        }
    }

    public void setValueAt(Object value, int row, int col) 
    {
        data[row][col]=value;

    }
    public void updateJarTable(Object[] row)

    {
        setValueAt(row[0],0,0);
        fireTableDataChanged();
        setValueAt(row[1],0,1);
        fireTableDataChanged();
        setValueAt(row[2],0,2);
        fireTableDataChanged();
        setValueAt(row[3],0,3);
        fireTableDataChanged();
        setValueAt(row[4],0,4);
        fireTableDataChanged();
    }
    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return data.length;
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // TODO Auto-generated method stub
        return data[rowIndex][columnIndex];
    }
}

在此之后我创建一个表并将此tablemodel应用于它:

table=new JTable(new MyTableModel());   

当我点击一个按钮时,应该追加一个新行。

submit.addActionListener(new ActionListener () {
public void actionPerformed(ActionEvent e)
{
Object[] row={"col1","col2","col3","col4","col5"};
model1.updateJarTable(row);
table.revalidate();
}
}); 

model1是:

private MyTableModel model1=new MyTableModel();

但是,当我运行时,我会在方法ArrayIndexOutofBoundsExceptionupdateJarTable

上获得setValueAt

我不知道我哪里出错了。请帮我找到它。谢谢 !

3 个答案:

答案 0 :(得分:3)

在下一行中显示您的问题:

Object[][] data=new Object[][]{

};

您有数组Object[0][],因为您无法设置值并捕获ArrayIndexOutOfBoundsException

1)您可以指定数组的维度。

2)或者以List为例存储数据。

3)在设置值时,以编程方式扩展数组(如果需要)。

另请尝试DefaultTableModel

答案 1 :(得分:2)

花一点时间看看你的代码......

首先你做...

table=new JTable(new MyTableModel());   

然后你做......

model1.updateJarTable(row);

model1如何与您分配给表格的模型相关?

尝试使用...

table=new JTable(model1);   

相反,只需确保model1在您应用到桌面之前已初始化,并且您以后不再重新分配(再次执行model1 = MyTableModel()之类的操作...

ArrayIndexOutofBoundsException归结为你有一个空数组

Object[][] data=new Object[][]{};

0行,0列。

您需要重新创建数组以容纳新数据,这不是那么容易或使用更动态的数据结构,例如java.util.List或简单地使用DefaultListModel

更新了基于列表的模型

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

    private String[] columnNames = {"Name",
        "Size",
        "Directory",
        "Last Modified Time",
        "Readable"};

    List<List> rows;

    public MyTableModel() {
        rows = new ArrayList<>(25);
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public Class getColumnClass(int c) {
        // Don't do this, what happens if the cell value is null??
        return getValueAt(0, c).getClass();
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col < 1) {
            return false;
        } else {
            return false;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        List columns = rows.get(row);
        columns.set(col, value);
        fireTableCellUpdated(row, col);
    }

    public void updateJarTable(Object[] row) {
        List columns = new ArrayList(row.length);
        columns.addAll(Arrays.asList(row));
        rows.add(columns);
        fireTableRowsInserted(rows.size() - 1, rows.size() - 1);
    }

    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return rows.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        List columns = rows.get(rowIndex);
        return columns.get(rowIndex);
    }
}

或者你可以做......

String[] columnNames = {"Name",
    "Size",
    "Directory",
    "Last Modified Time",
    "Readable"};
DefaultTableModel model = new DefaultTableModel(columnNames, 0);
//...
Object[] row={"col1","col2","col3","col4","col5"};
model.addRow(row);

为自己省事......

答案 2 :(得分:1)

我已经在相同的背景下发布了答案。

请在how to add an array to a Jtable when button is clicked java找到。

使用DefaultTableModel和简单调用addRow()方法添加新行。