Reputation: 53
I'm fighting with a implementation of a jTable. I created my own TableModel class. And there is the problem. Somehow my tableData array (ArrayList of Obejct[]) is not being written correctly. At the end I get a table where all the rows are having the values.
Does anyone see why the ArrayList is not written correctly?
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();
}
}
Upvotes: 3
Views: 2678
Reputation: 53
Thanks to trashgod I figured it out (see his post). Working code here:
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();
}
}
Upvotes: 1
Reputation: 205785
The parent implementation of setValueAt()
does nothing. You'll need to implement setValueAt()
to update your internal data structure, tableData
, and fire the appropriate TableModelEvent
, which will update your view.
@Override
public void setValueAt(Object aValue, int row, int col) {
... // update tableData
this.fireTableCellUpdated(row, col); // notify the view
}
As an aside, consider List<List<Object>>
instead of ArrayList<Object[]>
.
Upvotes: 2