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.

About the Author

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