Borrar todas las filas de un JTable

Ayer me hicieron una pregunta por correo que me pareció bastante interesante porque es un ejemplo perfecto de cómo un código simple y lógico puede contener errores enormes sin que sepamos donde falla.

El problema surgía al borrar todas las filas de un JTable. El código era:

void LimpiarJTable(){        
   int a =miModelo.getRowCount()-1;    
   System.out.println("Tabla "+a);     
   for(int i=0; i<a;i++){
      System.out.println("i "+i); 
      miModelo.removeRow(i );
   } 
}

A primera vista el código parece lógico. Primero mira cuantas filas hay (resta uno porque empiezan en 0). A continuación se dispone a borrar las filas una a una, desde 0 hasta n.

Los que tengáis práctica seguramente os habréis dado cuenta del error. Supongamos una tabla con 5 filas, el primer System.out dirá que la tabla tiene 5 filas, hasta ahí perfecto.
Comenzamos el borrado de la fila 0, la tabla tiene ahora 4 filas. Borramos la fila 1, quedan 3 filas. Borramos la fila 2, quedan 2 filas, Borramos la fila 3.. un momento, la tabla sólo tiene dos filas, ¿cómo vamos a borrar la 3?

Para mi este es el tipo de fallos que cuesta más localizar, sobre todo cuando eres novato. Si en vez de borrar en cada iteración la fila “i”, hubiéramos borrado la 0, funcionaría perfectamente, aunque sería “poco intuitivo”. Una forma más legible sería borrar un rango de filas de la 0 a la getRowCount()-1.

Por Carballude

Me llamo Pablo Carballude González, soy graduado en computación con master en HCI y Seguridad Informática. Actualmente trabajo para Amazon en Seattle como Software Developer Engineer. Soy de esas personas que no saben si los textos autobiográficos deben ser en primera o tercera persona. Lo intenté en segunda, pero no le entendí nada :P

28 comentarios

  1. Por lo general, y sobre todo si no se puede hacer por rangos, se recomienda hacer este tipo de operaciones con un bucle decreciente:

    void LimpiarJTable(){
    int a =miModelo.getRowCount()-1;
    System.out.println(«Tabla «+a);
    for(int i=a; i>=0;i–){
    System.out.println(«i «+i);
    miModelo.removeRow(i );
    }
    }

    Así te aseguras que nunca te excedes de índice.

  2. Mil gracias tio! jaja, llevo mas de media hora rompiéndome la cabeza pensando en porque no me furrulaba lo de borrar filas(tenia un código casi idéntico al primero que pones) y ya estaba a punto de mandar otro mail a Marian cuando encontré tu blog googleando por ai.
    Eres de la EUITIO, no? porque me suena de verte por el foro…
    Bueno pues eso,que gracias y que voy a echar un ojo por tu blog,a ver si encuentro más sorpresas agradables :D

  3. De nada hombre, me alegro de que te fuera útil :)

    Sí, soy de la EUITIO… con eso de apellidarse Carballude soy fácil de reconocer ;)

  4. como decimos en pais eres la verga papa, mil gracias tenia toda la mañana rompiendome la cabeza

  5. Exelente post y exelente respuesta, he estado hace varios dias buscando una solucion porque correctamente como dice el post inicial, deberia ser tal cual esta eel codigo, pero sin embargo se produce este error.

    Gracias tambien Manuel Cernuda por indicar como seria sin problemas solucionar este detalle.

    PD: Trabajo en mi casa y no tengo coneccion a internet como para haber averiguado antes este detalle

    Saludos

  6. eres barbaro nadie tenia esta respuesta en toda la web, hasta que encontre algo verdaderamente util…………. tks……….

  7. DefaultTableModel modelo = (DefaultTableModel) Tabla.getModel();
    while(modelo.getRowCount()>0)modelo.removeRow(0);

  8. Hola, muy buena su informacion, gracias por ello, pero quisiera saber como puedo eliminar columnas de un DefaultTableModel, espero sus respuestas y gracias de antemano.
    Salu2

  9. Me parece que tambien se puede agregando una llamada al mismo metodo de limpiar tabla dentro del for, aplicando la recursividad pues, asi el valor de a se estaria actualizando

  10. Saludos,

    Hay un error aun mas grande, bien eliminando 5 filas, pero imaginate 1000 o 100000.

    De manera recursiva de demoraria mucho.

    Intenta asi:

    miModelo.setRowCount( 0);

    Listo.

  11. DefaultTableModel modelo = (DefaultTableModel) Tabla.getModel();
    while(modelo.getRowCount()>0)modelo.removeRow(0);

    Muchas gracias a los posteros este codigo fuee de gran ayuda Dios les pague!!!! felicitaciones por la pagina fuee de gran ayuda!!! ;)

  12. Dejate de hinchar! usa los metodos che!
    ¡Hola!
    Las tablas se llenan con Table Models.
    private DefaultTableModel tModelo = new DefaultTableModel();
    Si venimos de un query seria algo asi
    while (rs.next()) {
    Componente compo = new Componente();

    ResultSetMetaData metaDatos = (ResultSetMetaData) rs.getMetaData();
    int numeroColumnas = metaDatos.getColumnCount() – 1;//Todo esto SOLO Para tener la cantidad de columnas! las rows las vas iterando a tu gusto y prueba luego

    Object[] etiquetas = new Object[numeroColumnas];

    for (int i = 0; i < numeroColumnas; i++) {
    etiquetas[i] = metaDatos.getColumnLabel(i + 2);
    }//aca yo itero con Mas DOS porque el primer componente es un ID y no quiero mostrarlo eso solo de referencia
    tModelo.setColumnIdentifiers(etiquetas);
    ACA VA COMO SERIA CON LAS FILAS Y LUEGO….
    Object[] fila = new Object[numeroColumnas];
    for (int i = 0; i < numeroColumnas; i++) {
    fila[i] = rs.getObject(i + 2).toString();
    }
    tModelo.addRow(fila);
    cuando la llenas con los metodos de la Table models
    LISTO PONELE QUE TENES LA TABLA LLENA EN TU ACTION LISTENER HACES ESTO
    tModelo.setColumnCount(0);
    tModelo.setRowCount(0);
    UNA VEZ QUE SETEAS EL MODELO EN CERO SE LO PASAS A LA TABLA QUE SIEMPRE NECESITA UN MODELO PARA SER
    tCompo.setModel(tModelo);//esta es la tabla!
    saludos
    SI LA QUERES ACTUALIZAR DENUEVO REPETIS LO DE ARRIBA

  13. Oigan una prugunta a todos los que comentan en este foro….Como puedo limpiar por completo una tabla una tabla, es decir, una ves que le carge las filas y columnas con un boton (cargar) , las quite con otro boton (Limpiar). Bueno si me pueden ayudar se los agredeceria demaciado.
    por que si peudo elimiar las filas pero para eliminar las columnas es lo que me esta causando problemas

  14. Solamente trata de cambiar el «i» por un «0»

    void LimpiarJTable(){
    int a =miModelo.getRowCount()-1;
    System.out.println("Tabla "+a);
    for(int i=0; i<a;i++){
    System.out.println("i "+i);
    miModelo.removeRow(i );
    }
    }

  15. I have noticed you don’t monetize your website, don’t waste your traffic, you can earn additional
    cash every month because you’ve got high quality content.
    If you want to know how to make extra bucks, search for: Ercannou’s essential adsense alternative

  16. I see you don’t monetize your page, don’t waste your traffic, you can earn extra bucks every month.
    You can use the best adsense alternative for any type of website (they approve all websites),
    for more info simply search in gooogle: boorfe’s tips
    monetize your website

  17. Muy buen dia. Tengo una duda, espero alguien pueda apoyarme, como puede eliminar las filas que cierta columna este vacía de un Jtable??

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *