如何动态添加一行
how can I add a row dynamically
我想动态添加行而不干扰 table 中的其他数据(数据硬编码在 Object[][] dataForTable
中。不想将数据保存在数据库中)。我没有从 TableModel 或 Table 本身找到任何方法来这样做。有没有什么方法可以在不替换 Object[][] dataForTable
或任何其他方式的情况下实现这一目标?
我还有其他情况。任何时候我都希望 Table 中多出一行为空。当将值放入该行时,将动态创建另一个空行。
更新: 我重新评估了这个答案,它包含一些错误和概念性问题。我们决定将 add/remove 行的选项从 Table 添加到 DefaultTableModel。所以你可以只使用 ((DefaultTableModel)table).addRow("Col1", "Col2", "Col3");只需确保列数与 table 列数完全匹配。
原回答如下:
默认的 table 模型不是 mutable 这可能是我们的疏忽。像这样的东西应该可以工作(尚未测试):
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);
}
}
我想动态添加行而不干扰 table 中的其他数据(数据硬编码在 Object[][] dataForTable
中。不想将数据保存在数据库中)。我没有从 TableModel 或 Table 本身找到任何方法来这样做。有没有什么方法可以在不替换 Object[][] dataForTable
或任何其他方式的情况下实现这一目标?
我还有其他情况。任何时候我都希望 Table 中多出一行为空。当将值放入该行时,将动态创建另一个空行。
更新: 我重新评估了这个答案,它包含一些错误和概念性问题。我们决定将 add/remove 行的选项从 Table 添加到 DefaultTableModel。所以你可以只使用 ((DefaultTableModel)table).addRow("Col1", "Col2", "Col3");只需确保列数与 table 列数完全匹配。
原回答如下:
默认的 table 模型不是 mutable 这可能是我们的疏忽。像这样的东西应该可以工作(尚未测试):
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);
}
}