Java 如何使用AbstractTableModel方法向JTable添加行?
我想向已初始化的JTable添加行。除其他要素外,我还有以下(相关)代码: 每当我试图运行该程序时,我都会得到一个NullPointerExceptionJava 如何使用AbstractTableModel方法向JTable添加行?,java,swing,nullpointerexception,jtable,row,Java,Swing,Nullpointerexception,Jtable,Row,我想向已初始化的JTable添加行。除其他要素外,我还有以下(相关)代码: 每当我试图运行该程序时,我都会得到一个NullPointerException at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source) at javax.swing.table.DefaultTableModel.<init>(Unknown Source) at javax.swing.table.DefaultTableMo
at javax.swing.table.DefaultTableModel.setDataVector(Unknown Source)
at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
at javax.swing.table.DefaultTableModel.<init>(Unknown Source)
为什么呢?我的代码怎么了?难道程序不能“找到”数据吗
编辑:第二种方法 我试图使用ArrayList作为存储数据的位置。。。但是还有“cols rows问题”,如下面的评论所示。。。找不到数组值(因为我现在使用的是ArrayList)。我怎样才能解决这个问题
import java.awt.Container;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
class sscce extends JFrame {
private static final long serialVersionUID = 1L; // Serial ID...
Container content = getContentPane();
AbstractTableModel myAbstractTableModel = new AbstractTableModel () {
private static final long serialVersionUID = 1L; // whatever
private String[] columnNames = {"AuftragNr", "Datum & Uhrzeit", "Von", "Nach", "erledigt?"};
private ArrayList<Object> data = new ArrayList<Object>();
public void addRow(List rowData) {
data.add(rowData);
fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
// can be solved via .size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
// no idea, how to solve that?!
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
}
return false;
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
// same issue here...
fireTableCellUpdated(row, col);
}
};
JTable auftragTable = new JTable(myAbstractTableModel);
JScrollPane tableScrollPane = new JScrollPane(auftragTable);
JButton auftragAenderungSpeichern = new JButton("speichern");
public sscce() {
setTitle("Auftragsverwaltung");
setSize(700, 500);
setLocation(500, 200);
setLayout(null);
setResizable(false);
tableScrollPane.setBounds(50, 50, 500, 200);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
JFrame f = new sscce();
f.show();
}
}
我试图使用ArrayList作为存储数据的位置。。。但是还有“cols rows问题”,如下面的评论所示。。。找不到数组值(因为我现在使用的是ArrayList)。我怎样才能解决这个问题
import java.awt.Container;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
class sscce extends JFrame {
private static final long serialVersionUID = 1L; // Serial ID...
Container content = getContentPane();
AbstractTableModel myAbstractTableModel = new AbstractTableModel () {
private static final long serialVersionUID = 1L; // whatever
private String[] columnNames = {"AuftragNr", "Datum & Uhrzeit", "Von", "Nach", "erledigt?"};
private ArrayList<Object> data = new ArrayList<Object>();
public void addRow(List rowData) {
data.add(rowData);
fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
// can be solved via .size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
// no idea, how to solve that?!
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
}
return false;
}
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
// same issue here...
fireTableCellUpdated(row, col);
}
};
JTable auftragTable = new JTable(myAbstractTableModel);
JScrollPane tableScrollPane = new JScrollPane(auftragTable);
JButton auftragAenderungSpeichern = new JButton("speichern");
public sscce() {
setTitle("Auftragsverwaltung");
setSize(700, 500);
setLocation(500, 200);
setLayout(null);
setResizable(false);
tableScrollPane.setBounds(50, 50, 500, 200);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
JFrame f = new sscce();
f.show();
}
}
是,找不到数组值,因为您没有使用数组。您需要从ArrayList中提取数据。如果您不熟悉ArrayList方法,请查看
关于您的代码,您有编译错误,无论您在哪里发现这些类型的错误,您都必须调查您可能做错了什么。主要是将ArrayList视为数组,当然不是,因此使用array.length或使用数组索引(array[i][j])的数组类型构造将失败。同样,请查看上面链接的ArrayList API或一个像样的ArrayList教程,了解如何使用这些家伙。例如,如果编译器告诉您ArrayList没有length属性或方法,那么请在ArrayList API中查找获取所需信息的适当方法。这就是API的用途
另外,您的ArrayList不应该包含对象,换句话说,它不应该是
ArrayList
,而是应该更具体。通常,表模型的行将包含一个对象,该对象的属性表示行中的每个项。因此,如果我们调用保存每行数据的类RowData,您的ArrayList将声明为ArrayList
。因此,要获取行col的值,需要从模型的ArrayList中提取行索引的RowData(假设这是行数据类的名称),然后调用对象的getter方法来提取col索引关联项。因为您试图创建自己的myAbstractTableModel
,您应该扩展而不是像DefaultTableModel
这样的具体实现。
使用ArrayList存储数据对象。向您展示如何执行此操作的基本知识
顺便说一下,如果没有理由的话,会使字段的可见性尽可能降低
也
就这样
public boolean isCellEditable(int row, int col) {
return col == 4;
}
为了更快地获得更好的帮助,请发布一个。因为您的数据[][]是
公共的
而不是最终的。。。在某些情况下,有人可以分配data=null
,我应该将它们声明为私有的private
如果这不是一个公开的好理由,你应该扩展AbstractTableModel
,而不是一个具体的实现,defaultTableMOdel已经有了dataVector
@nachokk:我以为他是在扩展AbstractTableModel,所以我的答案是错的。事实上,你的答案是正确的。考虑一下官方的回答吧,我真丢脸!好了,这就是为什么他会有空点异常??啊,我想你让我的大脑在思考!我知道Array/ArrayList的特性,但不知何故,我花了太长时间在它上面,无法清晰地思考。最后一件事:在上面的代码中,一切都应该正常。。。但是我不能在代码的其余部分调用'addRow()'?我是不是又漏掉了什么?一个解决方案是不将myAbstractTableModel用作匿名类,而是用作实际的类实例?像这样,我可以调用addRow()…是的,这就是它。。。对代码质量有任何批评吗?谢谢你的回复。我该怎么做?我必须添加一个新类吗?你已经创建了一个新类(匿名类),如果你要在不同的地方使用,你可以创建自己的类,或者。。。作为像AbstractTableModel myAbstractTableModel=new AbstractTableModel(){//实现所有抽象方法..
这样的匿名类,他还需要一个addRow(…)
方法,在向模型添加一行(可能应该是列表)后调用fireTableRowsInserted(…)
.好的,我已经改变了…但这直接导致了我的初始问题…我想使用*myAbstractTableModel.addRow(新对象[]{“Column 1”,“Column 2”,“Column 3”,“as”,false});*要向表中添加行,它不适用于AbstractTableModels,而只适用于DefaultTableModels…这里有解决方案吗?@HoverCraftFullOfels:我已经有了,但不知怎的,它不想接受我的输入方式…所以我尝试了一种类似于OP的解决方法。
import java.awt.Container;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
class sscce extends JFrame {
private static final long serialVersionUID = 1L; // Serial ID...
Container content = getContentPane();
AbstractTableModel myAbstractTableModel = new AbstractTableModel() {
private static final long serialVersionUID = 1L; // whatever
private String[] columnNames = {"AuftragNr", "Datum & Uhrzeit", "Von", "Nach", "erledigt?"};
private ArrayList<DataStore> data = new ArrayList<DataStore>();
public void addRow(DataStore rowData) {
data.add(rowData);
fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.size(); // length
// can be solved via .size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
// change made here
DataStore rowElement = data.get(row);
Object value = rowElement.getItemOnPosition(col);
return value;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
if (col == 4) {
return true;
}
return false;
}
public void setValueAt(Object value, int row, int col) {
// change made here
DataStore rowElement = data.get(row);
rowElement.setItemOnPosition(col, value);
fireTableCellUpdated(row, col);
}
};
JTable auftragTable = new JTable(myAbstractTableModel);
JScrollPane tableScrollPane = new JScrollPane(auftragTable);
JButton auftragAenderungSpeichern = new JButton("speichern");
public sscce() {
setTitle("Auftragsverwaltung");
setSize(700, 500);
setLocation(500, 200);
setLayout(null);
setResizable(false);
tableScrollPane.setBounds(50, 50, 500, 200);
content.add(tableScrollPane);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
@SuppressWarnings("deprecation")
public static void main(String[] args) {
JFrame f = new sscce();
f.show();
}
}
public class DataStore {
Integer auftragNr;
String datumUhrzeit;
String von;
String nach;
Boolean status;
public DataStore(Integer a, String b, String c, String d, Boolean e) {
auftragNr = a;
datumUhrzeit = b;
von = c;
nach = d;
status = e;
}
public Object getItemOnPosition(int pos) {
if(pos == 1) {
return (Integer) auftragNr;
}
if(pos == 2) {
return datumUhrzeit;
}
if(pos == 3) {
return von;
}
if(pos == 4) {
return nach;
}
if(pos == 5) {
return (Boolean) status;
}
return null;
}
public Object setItemOnPosition(int pos, Object newValue) {
if(pos == 1) {
auftragNr = (Integer) newValue;
}
if(pos == 2) {
datumUhrzeit = (String) newValue;
}
if(pos == 3) {
von = (String) newValue;
}
if(pos == 4) {
nach = (String) newValue;
}
if(pos == 5) {
status = (Boolean) newValue;
}
return null;
}
}
public boolean isCellEditable(int row, int col) {
if (col != 4) {
return false;
} else {
return true;
}
}
public boolean isCellEditable(int row, int col) {
return col == 4;
}