2

Swingを使用してJavaでアプリケーションを実行しています。2つのテーブルがあり、1つのテーブルから別のテーブルにコンテンツをコピーする必要があります(レプリケーション)。問題は、宛先テーブルの行をクリアすると、ソーステーブルの行も削除されることです。

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()

4

5 に答える 5

4

TableModel2つのテーブルの間をコピーしました。これは、2つのテーブルが同じデータを共有することを意味します。の内容を削除するとTableModel、両方のテーブルのデータが失われます。

2つの別々のTableModelインスタンスを作成し、それらの同期を維持する必要があります(たとえばTableModel、モデルが更新されるたびにイベントを発生させるためにリスナーを使用することにより)

于 2012-08-14T08:12:55.863 に答える
3

コピーバージョンでは、最初のテーブルのモデルを2番目のテーブルに設定します。したがって、2つのテーブルは同じモデルを共有します。モデルのコピーを作成する必要があります:

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);
}
于 2012-08-14T08:53:43.713 に答える
2

両方のテーブルが同じモデルを使用しています。表Bに独自のモデルを指定し、値を手動でコピーする必要があります。現在のcopyAllメソッドは、テーブルモデルへの参照をコピーしますが、内容はコピーしません。

于 2012-08-14T08:13:46.907 に答える
1

これは、2つのテーブルのTableModelを共有しているためです。copyメソッドでは、モデルのクローンを作成し、そのクローンを2番目のテーブルに使用する必要があります。

于 2012-08-14T08:12:58.033 に答える
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);
}
于 2012-08-14T08:50:10.230 に答える