Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] Filtrar, traspasar y eliminar filas de JTable

Estas en el tema de Filtrar, traspasar y eliminar filas de JTable en el foro de Java en Foros del Web. Hola a todos, saludos desde Mexico, recurro a ustedes después de horas de estar buscando una solución a mi problema con la eliminacion de algunas ...
  #1 (permalink)  
Antiguo 12/09/2018, 23:01
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 2 años, 7 meses
Puntos: 3
Pregunta Filtrar, traspasar y eliminar filas de JTable

Hola a todos, saludos desde Mexico, recurro a ustedes después de horas de estar buscando una solución a mi problema con la eliminacion de algunas filas les explico:

Tengo una primer tabla con algunos datos como los siguientes:
Nombre| Apellido
Diego | Lopez
Maria | Martinez
Ivon | Hernandez
Diego | Fernandez
Diego | Rodriguez

Tras ello en un Campo de texto ingreso una busqueda "Diego", y se realiza el filtro de los datos, posteriormente esos datos lo envio a una segunda tabla donde solo aparecen:
Diego | Lopez
Diego | Fernandez
Diego | Rodriguez

Ahora el problema es que quiero borrar de la primera tabla todas las filas que correspondan a alguien con nombre "diego", y bueno les comento que en parte lo he conseguido pero solo me elimina a 2 con ese nombre y me sigue dejando a 1:

el código para filtrar es el siguiente:
Código Java:
Ver original
  1. public void filtro() {      
  2.         Filtro.setRowFilter(RowFilter.regexFilter(busca.getText(), 0));  
  3.     }


El cual lo solicito desde el Campo de texto de busqueda:
Código Java:
Ver original
  1. private void buscaKeyTyped(java.awt.event.KeyEvent evt) {                                  
  2.         busca.addKeyListener(new KeyAdapter() {
  3.             public void keyReleased(final KeyEvent e) {
  4.                 String cadena = (busca.getText());
  5.                 busca.setText(cadena);
  6.                 repaint();
  7.                 filtro();
  8.             }
  9.         });
  10.         Filtro = new TableRowSorter(tabla1.getModel());
  11.         tabla1.setRowSorter(Filtro);

Una vez realizada la busqueda traspaso los datos a la segunda tabla con el siguiente codigo:

Código Java:
Ver original
  1. for (int i = 0; i < modelo1.getRowCount(); i++) {    
  2.         for(int c = 0; c < modelo1.getColumnCount(); c++){
  3.            
  4.             String Vector[]=new String[2];
  5.             if (modelo1.getValueAt(i, c).equals(busca.getText())) {
  6.             Vector[0]=modelo1.getValueAt(i, 0).toString();
  7.             Vector[1]=modelo1.getValueAt(i, 1).toString();
  8.             Pantalla2.modelo2.addRow(Vector);
  9.                   }
  10.             }
  11.          
  12.         }
  13.        
  14.         borrarFilasCon(busca.getText());// este metodo es con el que trato de borrar las filas con el valor que se esta buscando

El metodo que uso para borra es este:
Código Java:
Ver original
  1. public void borrarFilasCon(String nombre)
  2.  {
  3.     for (int f = 0; f < modelo1.getRowCount(); f++)
  4.     {
  5.       for(int c = 0; c < modelo1.getColumnCount(); c++)
  6.       {
  7.         if (modelo1.getValueAt(f, c).equals(nombre))
  8.            
  9.         {
  10.                        
  11.             modelo1.removeRow(f);
  12.             System.out.println(f);
  13.         } else {
  14.         }
  15.       }
  16.     }
  17.  }

Model1 es un DefaultTableModel;

Y bueno no encuentro como solucionarlo, mi problema es que al eliminar la primera fila con nombre Diego disminuye el numero de filas y ya no corresponden a lo que se eliminaria en un inicio pues las posiciones cambian...

Quedando asi:
Maria | Martinez
Ivon | Hernandez
Diego | Rodriguez


Espero puedan ayudarme y enverdad muchas gracias por prestarme de su atención
__________________
Desbloquea esos limites...

Última edición por sgrajaleshdz; 12/09/2018 a las 23:04 Razón: Error al redactar
  #2 (permalink)  
Antiguo 13/09/2018, 10:39
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.466
Antigüedad: 10 años, 2 meses
Puntos: 184
Respuesta: Filtrar, traspasar y eliminar filas de JTable

No es bueno eliminar filas sobre la misma tabla que iteras.

Puede pasar que estés reduciendo el tamaño de la tabla dinámicamente y eso afecta al bucle.

O eso o el último nombre tiene algo, un espacio en blanco o algo por el estilo que hace que no cuadre la comparación.

Me inclino más por el primer caso.

Prueba a crear una segunda tabla y a añadir los registros que no coincidan con el indicado, una vez finalizado el bucle haces:

tabla1 = tabla2;

y compruebas la información.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 13/09/2018, 17:27
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 2 años, 7 meses
Puntos: 3
Respuesta: Filtrar, traspasar y eliminar filas de JTable

Hola fuzzy, de hecho eso mismo pense, que se debia a que al eliminar la primera fila cambian los valores y respecto a lo de crear una segunda tabla no te entendí del todo, pero estaba pensando si hay alguna forma de eliminar los Index de la tabla desde el número mayor al menor evitando así que filas previas modifiquen su valor, o no se si hay alguna otra forma dde eliminar los registros que sean igual a "tal nombre".


Espero puedan ayudarme acepto sugerencias :D
__________________
Desbloquea esos limites...
  #4 (permalink)  
Antiguo 14/09/2018, 12:02
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.466
Antigüedad: 10 años, 2 meses
Puntos: 184
Respuesta: Filtrar, traspasar y eliminar filas de JTable

1. Recorrer y obtener los índices de la tabla a eliminar
2. Ordenar de mayor a menor
3. Eliminar los registros por ese orden.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 15/09/2018, 15:10
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 2 años, 7 meses
Puntos: 3
Respuesta: Filtrar, traspasar y eliminar filas de JTable

Pues no doy con la solucion me he hecho un enredo con lo de los arrays, al recorrer todo, estoy pensando en implementarlo directamente a una base de datos creo eso me facilitaría las cosas...

O bueno si es mucho pedir ayudame con un ejemplo pues los datos los cargo a la table desde un TXT y pues he ahi el problema que no me da la cabeza para pasarlo en un array, ya que los guardo con este formato

Diego,Fernandez
Maria,Martinez

y bueno no se que hacer ya me trabe
__________________
Desbloquea esos limites...
  #6 (permalink)  
Antiguo 15/09/2018, 17:11
 
Fecha de Ingreso: marzo-2016
Ubicación: World Wide Web
Mensajes: 30
Antigüedad: 2 años, 7 meses
Puntos: 3
De acuerdo Respuesta: Filtrar, traspasar y eliminar filas de JTable

Hola aquí de nuevo para comentarles que lo he logrado, tenias razón, con lo de recorrer la tabla y encontrar los valores, de hecho lo que hice fue meter los index de las filas a eliminar, en un ArrayList de tipo entero, para luego ordenarlos de mayor a menor mediante un sort, luego pase los valores de dicho array de objeto a int y se los envié a mi modelo para que eliminara de mayor a menor y quedo, funciona muy bien ahora solo adaptare el ejercicio a lo que necesito


Por si alguien necesita el arreglo funciona así:

Código Java:
Ver original
  1. public void borrarFilasCon(String nombre)
  2.  {
  3.     ArrayList<Integer> list = new ArrayList<>();
  4.     for (int f = 0; f < modelo1.getRowCount(); f++)
  5.     {
  6.       for(int c = 0; c < modelo1.getColumnCount(); c++)
  7.       {
  8.         if (modelo1.getValueAt(f, c).equals(nombre))
  9.            
  10.         {
  11.                        
  12.            list.add(f);
  13.  
  14.         } else {
  15.         }
  16.       }
  17.     }
  18.    imprime(list);
  19.  }

El método imprime contiene lo siguiente que es donde ordeno y elimino, siento que aun se puede optimizar pero pues aun revisare jejeje
Código Java:
Ver original
  1. public void imprime(ArrayList lista){
  2.         for(int i = 0; i < lista.size();i++){
  3.          
  4.             Comparator<Integer> comparador = Collections.reverseOrder();
  5.             Collections.sort(lista, comparador);
  6.  
  7.             modelo1.removeRow((int) lista.get(i));
  8.            
  9.            // System.out.println(lista.get(i)); // Aqui por si ocupan ver, el orden en que se pasa los numeros...
  10.    
  11.         }
  12.     }

Y bueno queda de esta manera si a alguien más le sirve adelante, Gracias por ayudarme y orientarme Fuzzylog un saludo hermano!!

__________________
Desbloquea esos limites...



La zona horaria es GMT -6. Ahora son las 16:34.