9

Java では、DefaultTableModel を使用して動的に列を JTable に追加しています。

//create DefaultTableModel with columns and no rows
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
JTable table = new JTable(tableModel);

columnNames 変数は、列名の文字列配列です。したがって、プログラムが起動して実行された後、ユーザーは追加の列を追加するオプションを利用できます。私は次のようにします

tableModel.addColumn("New column name");

これにより、必要に応じて列がテーブルに動的に追加されます。ユーザーは、追加された列を削除することもできます。このために、次のコードを使用します。

          TableColumn tcol = table.getColumnModel().getColumn(0);
          table.getColumnModel().removeColumn(tcol);

指定されたインデックスの列を削除する必要があります。私も試しました:

table.removeColumn(sheet.getColumn(assessmentName));

どちらも(視覚的に)機能しますが、ここに問題があります。追加された列を削除した後、別の列が追加されてテーブルが更新されると、以前に削除された列が再び表示されます。したがって、列を視覚的に削除している間、最後の 2 つのコード スニペットのどちらも、実際にはモデルから列を削除していません。ここで、列がモデルに追加されたので、列を削除する必要があると仮定していますか? 呼び出す必要がある特定のメソッドや、列を削除するために実装する必要があるロジックはありますか?

4

4 に答える 4

6

あなたのテーブルについて、電話してみてくださいtable.setAutoCreateColumnsFromModel(false);

この投稿には、列とその基になるデータを削除する方法の良い例があります。

于 2011-05-09T14:45:44.790 に答える
4

あなたが示すように、レベルでの行動はTableColumn視覚的な影響しかなく、まったく影響を与えTableModelません.

列を本当に削除したい場合は、DefaultTableModelそれをサブクラス化し、サブクラスで次のようにする必要があります。

public class MyTableModel extends DefaultTableModel {
    public void removeColumn(int column) {
        columnIdentifiers.remove(column);
        for (Object row: dataVector) {
            ((Vector) row).remove(column);
        }
        fireTableStructureChanged();
    }
}

私はそれをチェックしていませんが、あなたの場合はうまくいくはずです。

もちろん、removeColumn()EDT からのみ呼び出す必要があります。

この種のコードを作成することは誰にもお勧めしません。特に、を使用したり、から派生したりすることは、DefaultTableModelを定義するための最良の解決策ではありませんTableModel

于 2011-05-09T16:10:05.603 に答える
3

ここで、列がモデルに追加されたので、列を削除する必要があると仮定していますか?

はい。

呼び出す必要がある特定のメソッドや、列を削除するために実装する必要があるロジックはありますか?

いいえ。ただし、独自の方法を作成できます。

moveColumn(...); // to move the column to the end
setColumnCount(...); // to remove the last column

補足として、ユーザーが列を非表示/表示できるようにしたい場合は、Table Column Managerを確認してください。

于 2011-05-09T18:33:23.830 に答える
0

DefaultDataModel には実際には removeColumn() 関数がないため、実際に問題を解決できる関数を自分で作成しました。

private void removeColumn(int index, JTable myTable){
    int nRow= myTable.getRowCount();
    int nCol= myTable.getColumnCount()-1;
    Object[][] cells= new Object[nRow][nCol];
    String[] names= new String[nCol];

    for(int j=0; j<nCol; j++){
        if(j<index){
            names[j]= myTable.getColumnName(j);
            for(int i=0; i<nRow; i++){
                cells[i][j]= myTable.getValueAt(i, j);
            }
        }else{
            names[j]= myTable.getColumnName(j+1);
            for(int i=0; i<nRow; i++){
                cells[i][j]= myTable.getValueAt(i, j+1);
            }
        }
    }

    DefaultTableModel newModel= new DefaultTableModel(cells, names);
    myTable.setModel(newModel);       
}
于 2015-04-06T01:45:13.123 に答える