2011-05-09 158 views
8

在Java中,我使用DefaultTableModel動態地將列添加到JTable中。從Java中的TableModel中刪除列

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

他們兩人的工作(視覺),但這裏的問題。刪除添加的列後,如果添加了另一列並刷新表,則以前刪除的列將再次出現。因此,當它以可視方式移除列時,最後兩個代碼片段實際上都不會將其從模型中移除。我在這裏假設,因爲列被添加到需要從中刪除的模型中?是否有我需要調用的特定方法或需要實施的一些邏輯來刪除列?

回答

6

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

This post有一個很好的例子,對如何刪除列和基礎數據。

+0

+1,用於setAutoCreateColumnsFromModel()方法。這是一個非常有用的方法。 – camickr 2011-05-09 18:34:10

+0

感謝該帖子的鏈接只是我需要的信息 – Mark 2011-05-10 19:48:10

+0

非常感謝。沒有意識到這個功能。 – Mark 2011-05-11 15:58:32

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

我沒有檢查它,但它應該在你的工作情況。

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

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

3

我在這裏假設,因爲列被添加到模型,它需要從哪裏刪除?

是的。

是否有一個特定的方法,我需要調用或某些邏輯,我需要執行刪除列?

沒有,但你可以讓你自己的方法:

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

作爲一個側面說明,如果你想給用戶隱藏/顯示列檢查出Table Column Manager的能力。

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