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

时间:2012-08-14 08:11:05

标签: java swing jtable tablemodel

我正在使用Swing在Java中进行应用程序。我有两个表,我必须将内容从一个表复制到另一个表(复制。)问题是如果我清除目标表行,那么我的源表行也会被删除。

如果我按CopyAll,我会将所有内容从Table-A复制到Table-B。如果我按清除,那么我必须清除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的模型,然后以clearTable()方法清除它。

如果上述copyAll()方法有误,请告诉我如何实施copyAll()removeTableB()

5 个答案:

答案 0 :(得分:4)

您已在两个表之间复制了TableModel。这意味着两个表共享相同的数据。如果删除TableModel的内容,则两个表都将丢失其数据。

您应该创建两个单独的TableModel实例,并使它们保持同步(例如,每次更新模型时,使用一个侦听器作为TableModel触发事件)

答案 1 :(得分: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 :(得分:2)

两个表都使用相同的模型。您必须为表B提供自己的模型,手动复制值。您当前的copyAll方法将引用复制到表模型,它不会复制内容

答案 3 :(得分:1)

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

答案 4 :(得分:1)

如果您使用DefaultTableModel您可以使用VectorgetDataVector()从模型中获取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);
}