2011-05-09 164 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);  
}