Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从TableModel中删除列_Java_Swing_Tablemodel - Fatal编程技术网

在Java中从TableModel中删除列

在Java中从TableModel中删除列,java,swing,tablemodel,Java,Swing,Tablemodel,在Java中,我使用DefaultTableModel向JTable动态添加一列 //create DefaultTableModel with columns and no rows DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); JTable table = new JTable(tableModel); columnNames变量是具有列名的字符串数组。因此,在程序启动并运行后,用户可以选择添加其

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

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

对于您的桌子,请尝试呼叫


在如何删除列和基础数据方面有一个很好的示例。

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);       
}
private void remove列(int索引,JTable myTable){
int nRow=myTable.getRowCount();
int nCol=myTable.getColumnCount()-1;
对象[][]单元格=新对象[nRow][nCol];
字符串[]名称=新字符串[nCol];

对于(int j=0;j+1,对于setAutoCreateColumnsFromModel()方法。这是一个非常有用的方法。感谢那篇文章中的链接正是我需要的信息。谢谢。我不知道该功能。第二个链接已断开:)