在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));
它们都可以(视觉上)工作,但这就是问题所在。删除添加的列后,如果添加了另一列并且表刷新,则先前删除的列再次出现。因此,虽然它在视觉上删除了列,但最后两个代码片段实际上都没有从模型中删除它。我在这里假设,因为列已添加到需要从中移除的模型中?是否需要调用特定方法或需要实现的一些逻辑来删除列?
答案 0 :(得分:6)
对于您的表格,请尝试拨打table.setAutoCreateColumnsFromModel(false);
This post就如何删除列和基础数据有一个很好的例子。
答案 1 :(得分: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
不是定义TableModel
的最佳解决方案。
答案 2 :(得分:3)
我在这里假设,因为列已添加到需要从中移除的模型中?
是
是否需要调用特定方法或需要实现一些逻辑来删除列?
不,但你可以自己制定方法:
moveColumn(...); // to move the column to the end
setColumnCount(...); // to remove the last column
作为附注,如果您想让用户隐藏/显示列,请查看Table Column Manager。
答案 3 :(得分: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);
}