Удаление столбца из TableModel в 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));

оба они работают (визуально), но вот проблема. После удаления добавленного столбца, если добавляется другой столбец и таблица обновляется, ранее удаленный столбец снова появляется. Таким образом, пока он визуально удаляет столбец, ни один из последних двух фрагментов кода фактически не удаляет его из модели. Я предполагаю, что, поскольку столбец был добавлен в модель, из которой он должен быть удален? Есть есть конкретный метод, который мне нужно вызвать, или какая-то логика, которую мне нужно реализовать для удаления столбца?

4 ответов


для вашего стола, попробуйте позвонить 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();
    }
}

Я не проверял, но он должен работать в вашем случае.

конечно, removeColumn() следует вызывать только из EDT.

обратите внимание, что я бы не рекомендовал никому создавать такой код; в в частности, используя или выводя из, 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);       
}