清除一个JTable中的数据也会删除另一个JTable

问题描述 投票:0回答:5

我正在使用 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()

java swing jtable tablemodel
5个回答
4
投票

您已复制两个表之间的

TableModel
。这意味着两个表共享相同的数据。如果删除
TableModel
的内容,两个表都会丢失数据。

您应该创建两个单独的

TableModel
实例,并保持它们同步(例如,通过使用侦听器,因为
TableModel
在每次更新模型时都会触发事件)


3
投票

在您的副本版本中,您将第一个表的模型设置为第二个表。所以这两个表共享相同的模型。您应该复制该模型:

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);
}

2
投票

两张桌子都使用相同的型号。您必须为表 B 提供它自己的模型,手动复制值。您当前的

copyAll
方法将 reference 复制到表模型,它不会复制 contents


1
投票

那是因为您共享两个表的 TableModel。在复制方法中,您应该创建模型的克隆并将该克隆用于第二个表。


1
投票

如果您使用

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.