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

他们都工作(视觉上),但这是问题所在。删除添加的列后,如果添加了另一列并且表格刷新,则先前删除的列再次存在。因此,虽然它在视觉上删除了该列,但最后两个代码片段实际上都没有将它从模型中删除。我在这里假设,由于该列已添加到需要从中删除的模型中?是否有我需要调用的特定方法或我需要实现一些逻辑来删除列?

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不是定义 a 的最佳解决方案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 回答