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 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.
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
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 ;)
como decimos en pais eres la verga papa, mil gracias tenia toda la mañana rompiendome la cabeza
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
eres barbaro nadie tenia esta respuesta en toda la web, hasta que encontre algo verdaderamente util…………. tks……….
La proxima vez que te vea, recuerdame que te haga una mamada de agradecimiento xD
@miguel, @Nicolas Aranda, @elsersh, @Vitoro: De nada :) Me alegro de que os haya servido ;)
me sirvio mucho gracias ….
DefaultTableModel modelo = (DefaultTableModel) Tabla.getModel();
while(modelo.getRowCount()>0)modelo.removeRow(0);
gracias Luiyit me sirvio mucho
gracias Luiyit me sirvio mas q el de Carballude
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
Excelente Gracias!!
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
GRACIAS MEN… MUY LOGICO…
ADEMAS DE INTERESANTE…
SLUDOS
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.
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!!! ;)
resalpa84: –> PERFECTO y sencillo :). Lo que es conocer el lenguajejejeje
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
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
Luiyit, eres un hacha.
hmmmmm no me sirve
Gracias amigo!! sirvió mucho
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 );
}
}
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
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
Muy buen dia. Tengo una duda, espero alguien pueda apoyarme, como puede eliminar las filas que cierta columna este vacía de un Jtable??