Удаление столбца из TableModel в Java - PullRequest
8 голосов
/ 09 мая 2011

В 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 ]

6 голосов
/ 09 мая 2011

Для вашего стола, попробуйте позвонить table.setAutoCreateColumnsFromModel(false);

Этот пост содержит хороший пример того, как удалить столбец и базовые данные.

4 голосов
/ 09 мая 2011

Действие на уровне 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.

3 голосов
/ 09 мая 2011

Я предполагаю, что, поскольку столбец был добавлен в модель, он должен быть удален?

Да.

Есть ли какой-то конкретный метод, который мне нужно вызвать, или какая-то логика, которую мне нужно реализовать для удаления столбца?

Нет, но вы можете создать свой собственный метод:

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

В качестве примечания, если вы хотите дать пользователям возможность скрывать / показывать столбцы, ознакомьтесь с Диспетчером столбцов таблицы .

0 голосов
/ 06 апреля 2015

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