簡體   English   中英

在Java中從TableModel中刪除列

[英]Removing Column from TableModel in Java

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

它們都可以(視覺上)工作,但這就是問題所在。 刪除添加的列后,如果添加了另一列並且表刷新,則先前刪除的列再次出現。 因此,雖然它在視覺上刪除了列,但最后兩個代碼片段實際上都沒有從模型中刪除它。 我在這里假設,因為列已添加到需要從中移除的模型中? 是否需要調用特定方法或需要實現的一些邏輯來刪除列?

對於你的表,嘗試調用table.setAutoCreateColumnsFromModel(false);

這篇文章就如何刪除列和底層數據有一個很好的例子。

正如您所示,在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();
    }
}

我沒有檢查過,但它應該適用於你的情況。

當然,只應從EDT調用removeColumn()

請注意,我不會鼓勵任何人制作這種代碼; 特別是,使用DefaultTableModel或從中派生,並不是定義TableModel的最佳解決方案。

我在這里假設,因為列已添加到需要從中移除的模型中?

是。

是否需要調用特定方法或需要實現的一些邏輯來刪除列?

不,但你可以自己制定方法:

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

作為旁注,如果您希望為用戶提供隱藏/顯示列的功能,請查看表列管理器

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM