我正在使用 Swing 编写 Java 应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制)。问题是,如果我清除目标
Table
行,那么我的源表行也会被删除。
如果我按
CopyAll
,那么我会将Table-A
中的所有内容复制到Table-B
。
如果我按
Clear
,那么我必须清除Table-B
。但问题是Table-A
也正在被清除。
复印:
public void copyAll() {
TableModel tableAModel = tableA.getModel();
tableB.setModel(tableAModel);
repaint();
}
用于清除行(我正在做
table-B
):
public void clearTableB() {
DefaultTableModel clearTableData = (DefaultTableModel) tableB.getModel();
clearTableData.setNumRows(0);
}
我认为,我在使用
copyAll()
方法复制时遇到问题。我得到 tableA
的 Model
,然后用 clearTable()
方法清除它。
如果以上
copyAll()
方法有误,请告诉我如何实现copyAll()
,removeTableB()
。
您已复制两个表之间的
TableModel
。这意味着两个表共享相同的数据。如果删除 TableModel
的内容,两个表都会丢失数据。
您应该创建两个单独的
TableModel
实例,并保持它们同步(例如,通过使用侦听器,因为 TableModel
在每次更新模型时都会触发事件)
在您的副本版本中,您将第一个表的模型设置为第二个表。所以这两个表共享相同的模型。您应该复制该模型:
public void copyAll() {
final TableModel tableAModel = tableA.getModel();
final DefaultTableModel copy = new DefaultTableModel(tableAModel.getRowCount(), 0);
for (int column = 0; column < tableAModel.getColumnCount(); column++) {
copy.addColumn(tableAModel.getColumnName(column));
for (int row = 0; row < tableAModel.getRowCount(); row++)
copy.setValueAt(tableAModel.getValueAt(row, column), row, column);
}
tableB.setModel(copy);
}
两张桌子都使用相同的型号。您必须为表 B 提供它自己的模型,手动复制值。您当前的
copyAll
方法将 reference 复制到表模型,它不会复制 contents。
那是因为您共享两个表的 TableModel。在复制方法中,您应该创建模型的克隆并将该克隆用于第二个表。
如果您使用
DefaultTableModel
,您可以使用 Vector
和 getDataVector()
从模型中获取 clone()
数据。
public void copyAll() {
TableModel tableAModel = tableA.getModel(), tableModelB;
Vector tableModelBDataVector = ((DefaultTableModel)tableAModel).getDataVector();
int tableModelAColumnCount = tableAModel.getColumnCount();
Vector<String> tableModelAColumnVector = new Vector<String>(tableModelAColumnCount);
for (int i = 0; i < tableModelAColumnCount; i++)
tableModelAColumnVector.add(tableAModel.getColumnName(i));
tableModelB = new DefaultTableModel((Vector)tableModelBDataVector.clone(), (Vector)tableModelAColumnVector.clone());
tableB.setModel(tableModelB);
}