在模型中更新 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" 的示例中起作用?
修改了我发现使用模型的示例。
最初样本只会添加一条新记录。
修改代码以允许编辑字段并包含 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" 的示例中起作用?