【问题标题】:Adding rows to a model but not getting added. Getting arrayindex out of bounds exception向模型添加行但未添加。让arrayindex越界异常
【发布时间】:2014-03-27 06:59:45
【问题描述】:

我正在尝试创建一个包含 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];
    }
}

在此之后,我将创建一个表并将这个表模型应用于它:

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();

但是当我运行它时,在方法上得到ArrayIndexOutofBoundsExceptionupdateJarTablesetValueAt

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

【问题讨论】:

  • 最好使用 DefaultTableModel 而不是重新发明轮子实现自己的表模型

标签: java swing jtable tablemodel


【解决方案1】:

下一行似乎是您的问题:

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

};

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

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

2) 或者将数据存储在List 中。

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

也可以试试DefaultTableModel

【讨论】:

  • 如果我使用列表而不是二维数组,如何更改“SetValueAt”和“GetValueAt”方法中的行?
【解决方案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);

省去你的麻烦...

【讨论】:

  • 你很棒的发现。我改变了它并尝试了。我又遇到了同样的例外!
  • 我是 java 新手,没有使用过 List 或 Vector。如果我使用列表或向量,你能告诉我如何替换“SetValueAt”和“GetValueAt”方法中的行吗?
【解决方案3】:

我已经在相同的上下文中发布了答案。

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

使用DefaultTableModel 并在其上简单调用addRow() 方法以添加新行。

【讨论】:

  • @braj 即使我在开始创建新课程之前也尝试过这个。但是那个 addRow() 方法不起作用。我的桌子没有更新。不知道为什么!
  • 请查看上述链接中发布的示例代码。
  • @Braj 是的,实际上我昨天刚开始写这篇文章时就看到了那个帖子。试图实现它。但是没有用。所以继续使用这种方法!
  • 您遇到的问题在哪里?你有什么例外吗?或者是其他东西。请提供一些信息。
猜你喜欢
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多