我希望动态添加行而不会干扰表中的其他数据(数据在Object[][] dataForTable
中进行硬编码。不想在数据库中保留数据)。我没有从TableModel或Table本身找到任何方法来执行此操作。是否有任何方法可以在不替换Object[][] dataForTable
或其他任何方式的情况下实现此目的?
我有其他情况。在任何时候我都想在表中添加一个空行。将值添加到此行时,将动态创建另一个空行。
答案 0 :(得分:1)
更新:我重新评估了这个答案,其中包含一些错误和概念问题。我们决定添加选项以将表中的行添加/删除到DefaultTableModel。所以你可以使用((DefaultTableModel)表).addRow(“Col1”,“Col2”,“Col3”);只需确保列数与表列数完全匹配。
以下原始答案:
默认表模型不可变,这可能是我们的遗漏。这样的事情应该可行(尚未测试):
public class MyTableModel implements TableModel {
private ArrayList<Object[]) data;
private String[] columnNames;
private EventDispatcher dispatcher = new EventDispatcher();
private boolean editable;
public MyTableModel(String[] columnNames, Object[][] data) {
this(columnNames, data, false);
}
public MyTableModel(String[] columnNames, Object[][] data, boolean editable) {
this.data = new ArrayList<Object[]>();
for(Object[] o : data) {
this.data.add(o);
}
this.columnNames = columnNames;
this.editable = editable;
}
/**
* @inheritDoc
*/
public int getRowCount() {
return data.length;
}
/**
* @inheritDoc
*/
public int getColumnCount() {
return columnNames.length;
}
/**
* @inheritDoc
*/
public String getColumnName(int i) {
return columnNames[i];
}
/**
* @inheritDoc
*/
public boolean isCellEditable(int row, int column) {
return editable;
}
/**
* @inheritDoc
*/
public Object getValueAt(int row, int column) {
try {
return data.get(row)[column];
} catch(ArrayIndexOutOfBoundsException err) {
// not the best situation but quite useful for the resource editor
//err.printStackTrace();
return "";
}
}
/**
* @inheritDoc
*/
public void setValueAt(int row, int column, Object o) {
data.get(row)[column] = o;
dispatcher.fireDataChangeEvent(column, row);
}
/**
* @inheritDoc
*/
public void addDataChangeListener(DataChangedListener d) {
dispatcher.addListener(d);
}
/**
* @inheritDoc
*/
public void removeDataChangeListener(DataChangedListener d) {
dispatcher.removeListener(d);
}
public void addRow(Object[] row) {
data.add(row);
dispatcher.fireDataChangeEvent(-1, row);
}
}