我正在与jTable的实现作斗争。我创建了自己的TableModel类。而且存在问题。不知怎的,我的tableData数组(Obejct []的ArrayList)没有被正确写入。最后,我得到一个表,其中所有行都有值。
有没有人知道为什么没有正确编写ArrayList?
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Auftragsnummer",
"Kunde",
"Kunden Nr.",
"Erfasst",
"Kommt",
"Geht",
"Kommentar"};
String[] temp_delete = new String[10];
int index_delete = 0;
private ArrayList<Object[]> tableData = new ArrayList<Object[]>();
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return tableData.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
Object [] temp = tableData.get(row);
return temp[col];
}
public void removeAllEntry(){
for (int i = 0; i < tableData.size(); i++) {
tableData.remove(i);
}
model.fireTableDataChanged();
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int row, int col) {
switch (col){
case 4:
return true;
default: return false;
}
}
public void addText(Object[] object) {
tableData.add(object);
fireTableDataChanged();
}
}
答案 0 :(得分:2)
setValueAt()
的父实现不执行任何操作。您需要实施setValueAt()
来更新内部数据结构tableData
,然后触发相应的TableModelEvent
,这将更新您的观点。
@Override
public void setValueAt(Object aValue, int row, int col) {
... // update tableData
this.fireTableCellUpdated(row, col); // notify the view
}
另外,请考虑List<List<Object>>
而不是ArrayList<Object[]>
。
答案 1 :(得分:1)
感谢trashgod我想出来了(见他的帖子)。这里的工作代码:
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Auftragsnummer",
"Kunde",
"Kunden Nr.",
"Erfasst",
"Kommt",
"Geht",
"Kommentar",
"Abteilung"};
String[] temp_delete = new String[10];
int index_delete = 0;
private ArrayList<ArrayList<Object>> tableData = new ArrayList<ArrayList<Object>>();
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return tableData.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
if(tableData.size()> 0){
return tableData.get(row).get(col);
}
return null;
}
public void removeAllEntry(){
tableData.clear();
model.fireTableDataChanged();
}
/*
* JTable uses this method to determine the default renderer/
* editor for each cell. If we didn't implement this method,
* then the last column would contain text ("true"/"false"),
* rather than a check box.
*/
public Class getColumnClass(int c) {
if(tableData.size()> 0){
return getValueAt(0, c).getClass();
}
return String.class;
}
/*
* Don't need to implement this method unless your table's
* editable.
*/
public boolean isCellEditable(int row, int col) {
//Note that the data/cell address is constant,
//no matter where the cell appears onscreen.
switch (col){
case 4:
return true;
default: return false;
}
}
/*
* Don't need to implement this method unless your table's
* data can change.
*/
public void setValueAt(Object value, int row, int col) {
if(tableData.size() <= row){
ArrayList<Object> arrayList = new ArrayList<Object>();
for(int i = 0; i < columnNames.length;i++){
arrayList.add("");
}
tableData.add(arrayList);
}
ArrayList<Object> object = tableData.get(row);
object.add(col, value);
tableData.set(row, object);
fireTableDataChanged();
}
}