在模型中更新 ArrayList<Object[]> 会产生编译错误

Updating ArrayList<Object[]> within model is producing a compilation error

修改了我发现使用模型的示例。 最初样本只会添加一条新记录。 修改代码以允许编辑字段并包含 setValueAt() 调用 以维护任何更改。 数据存储在对象数组的 ArrayList 中,这在尝试更新 ArrayList 时会产生错误。

使用时:

al.set(row, value);

它产生错误:

TableWithModel.java:66: error: no suitable method found for set(int,Object)
                    al.set(row, value);
                      ^
method ArrayList.set(int,Object[]) is not applicable
  (actual argument Object cannot be converted to Object[] by method invocation conversion)
1 error

尝试了各种不同的语法,但得到了不同的错误。 一些明显的事情被忽略了,但不确定是什么。

import java.awt.*;
import java.util.*;

import javax.swing.*;
import javax.swing.table.*;

public class TableWithModel extends JFrame {

    MyModel model;

    TableWithModel(Object[][] obj, String[] header) {
        super("Static JTable example");

        JPanel panel = new JPanel(new BorderLayout());
        model = new MyModel(obj, header);
        JTable table = new JTable(model);
        panel.add(new JScrollPane(table));
        add(panel);    // adding panel to frame
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setVisible(true);
        pack();
    }

    public static void main(String[] args) {
        String[][] rowAndColumn = {
                {"Row1", "Column2"},
                {"Row2", "Column2"},
                {"Row3", "Column2"},
                {"Row4", "Column2"}
        };
        String[] header = {"Column1", "Column2"};
        TableWithModel twm = new TableWithModel(rowAndColumn, header);
    }

    class MyModel extends AbstractTableModel {

        ArrayList<Object[]> al;
        String[] header;

        MyModel(Object[][] obj, String[] header) {
            this.header = header;
            al = new ArrayList<Object[]>();
            for(int i = 0; i < obj.length; ++i)
                al.add(obj[i]);
        }
        public int getRowCount() {
            return al.size();
        }

        public int getColumnCount() {
            return header.length;
        }

        public Object getValueAt(int rowIndex, int columnIndex) {
            return al.get(rowIndex)[columnIndex];
        }

        public String getColumnName(int index) {
            return header[index];
        }

        public boolean isCellEditable(int row, int col)
        { return true; }

        public void setValueAt(Object value, int row, int col) {
            al.set(row, value);
            fireTableCellUpdated(row, col);
        }

    }
}

ArrayList 变量 al 保存对象的 数组 。要更新 ArrayList 中索引 row 处存储的第 col 列的对象数组元素,您需要使用以下内容:

public void setValueAt(Object value, int row, int col) {
    al.get(row)[col] = value;
    fireTableCellUpdated(row, col);
}

al.get(row)[col] = value; 是 shorthand 用于以下内容:

Object[] data = al.get(row);
data[col] = value;

这类似于 getValueAt 方法中已经实现的内容,只是您设置的是数组元素而不是检索它。

al.set(row, value); 无法编译的原因是 set 方法期望第二个参数是 Object[] 数组,而不是 Object,因为那是ArrayList 包含什么。

感谢您的回复。 运行 快速测试,它有效。 有点奇怪的是调用 "get" 而不是 "set".

发布后不久,我就找到了使用 "set"

的解决方案
           Object[] data = al.get(row);
           data[col] = value;
           al.set(row, data);

使用该集合很有意义,但是是什么使它在您使用 "get" 的示例中起作用?