2011-05-09 9 views
8

En Java, estoy usando DefaultTableModel para agregar dinámicamente una columna a una JTable.Eliminar columna de TableModel en Java

//create DefaultTableModel with columns and no rows 
DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0); 
JTable table = new JTable(tableModel); 

La variable columnNames es una matriz de cadenas con los nombres de las columnas. Entonces, después de que el programa esté funcionando, el usuario tiene la opción de agregar columnas adicionales. Lo hago de la siguiente manera

tableModel.addColumn("New column name"); 

Que dinámicamente agrega la columna a la tabla como desee. El usuario también puede eliminar columnas agregadas. Para este uso el siguiente código:

  TableColumn tcol = table.getColumnModel().getColumn(0); 
      table.getColumnModel().removeColumn(tcol); 

que debe retirar la columna en un índice especificado, También he intentado:

table.removeColumn(sheet.getColumn(assessmentName)); 

Ambos trabajan (visualmente), pero aquí está el problema . Después de eliminar una columna agregada, si se agrega otra columna y la tabla se actualiza, la columna eliminada previamente vuelve a estar allí. Por lo tanto, aunque está eliminando la columna visualmente, ninguno de los dos últimos fragmentos de código realmente lo elimina del modelo. Supongo que, dado que la columna se agregó al modelo, ¿de dónde debe eliminarse? ¿Hay algún método específico al que necesite llamar o alguna lógica que deba implementar para eliminar la columna?

Respuesta

6

para su mesa, intente llamar table.setAutoCreateColumnsFromModel(false);

This post tiene un buen ejemplo de cómo eliminar la columna y los datos subyacentes.

+0

+1, para el método setAutoCreateColumnsFromModel(). Este es un método muy útil. – camickr

+0

Gracias el enlace de esa publicación fue solo la información que necesitaba – Mark

+0

Muchas gracias. No estaba enterado de la característica. – Mark

4

Actuando en el nivel TableColumn, como muestra, solo tiene un impacto visual pero no afecta el TableModel cualquiera.

Si desea eliminar realmente una columna de DefaultTableModel entonces tendrá que hacerla una subclase y luego, en la subclase:

public class MyTableModel extends DefaultTableModel { 
    public void removeColumn(int column) { 
     columnIdentifiers.remove(column); 
     for (Object row: dataVector) { 
      ((Vector) row).remove(column); 
     } 
     fireTableStructureChanged(); 
    } 
} 

yo no lo he comprobado, pero debería funcionar en su caso .

Por supuesto, removeColumn() solo debe llamarse desde el EDT.

Tenga en cuenta que no recomendaría a nadie que produzca este tipo de código; en particular, usar o derivar de DefaultTableModel no es la mejor solución para definir un TableModel.

3

Supongo que, dado que la columna se ha agregado al modelo, ¿de dónde es necesario eliminarla?

Sí.

¿Hay algún método específico que necesite llamar o alguna lógica que deba implementar para eliminar la columna?

No, pero usted puede hacer su propio método:

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

Como nota al margen, si usted quiere dar a los usuarios la capacidad de ocultar/mostrar columnas echa un vistazo a la Table Column Manager.

0

DefaultDataModel no tiene una función realmente removeColumn(), así que escribí una función yo mismo, que realmente puede resolver el problema.

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);  
} 
Cuestiones relacionadas