miércoles, 17 de agosto de 2016

Filtrar datos de un jTable a partir de una búsqueda en JTextField


Una de las acciones indispensables en un sistema informático, son si duda las búsquedas. Las búsquedas de registros implica presentar al usuario la información que necesita y hacerlo de la manera más fácil para el usuario.


En lo personal me gusta añadir el método de ir filtrando la información de una tabla mientras el usuario escribe y así se va viendo la información aproximada de lo que el usuario está buscando.

Para hacer esto distingo dos opciones:

1.- Filtrar los datos previamente cargados en la tabla.
2.- Filtrar y mostrar los datos de la tabla de acuerdo a lo que haya directamente en las bases de datos de donde se toma la información visualizada en la tabla.

Cada una de las opciones anteriores tiene sus ventajas y desventajas, la principal ventaja de la opción 1, es que los datos se mostrarán relativamente más rápido ya que la información ya está en la tabla, su principal desventaja es, que si hay cambios en la base de datos, esos registros no se mostrarán. En la opción dos, la ventaja principal es que los registros mostrados en la tabla están actualizados ya que se toman directo de la base de datos, desventaja principal, suponiendo que haya muchos registros, cada búsqueda se tardará para ir a la base de datos.

Ahora, el código para filtrar los datos solamente de la tabla es el siguiente:
Primero se crea el siguiente método:

/* declarar la siguiente variable en la clase*/
DefaultTableModel dm;

/* Método filtro*/
private void filtro(String consulta, JTable jtableBuscar){
        dm = (DefaultTableModel) jtableBuscar.getModel();
        TableRowSorter<DefaultTableModel> tr = new TableRowSorter<>(dm);
        jtableBuscar.setRowSorter(tr);
        tr.setRowFilter(RowFilter.regexFilter(consulta));
}

Para invocar al método, se debe hacerlo en el evento <key released> del JTextField utilizado para buscar registros y se invoca de la siguiente manera:

/*A éste método se le envía el texto a buscar obtenido del JTextField, considerar si es necesario estandarizar a mayúsculas o minúsculas, además se envía la tabla en la que se desea que se realice el filtro, de este modo el método se puede reutilizar en diferentes tablas*/
filtro(jtxtBuscarNombre.getText().toUpperCase(), jtableConsultas);

El método de filtrar las filas del JTable que coincidan con lo que se esté escribiendo obtenido directamente desde la base de datos, es un poco más extenso, tanto en código como en explicación.

No lo explicaré, mejor pueden descargar el ejemplo completo de github para que lo puedan probar.






Gracias por visitar.

16 comentarios:

  1. Buenos dias

    Quiero hace runa busquedad o consulta de un solo campo de una tabla de la base de datos

    ResponderBorrar
  2. eso ya es más simple, en uno de mis proyectos completos, puedes encontrar ese ejemplo.

    ResponderBorrar
  3. fernando, como se llama el proyecto para consultar ciertos campos de mi tabla?

    ResponderBorrar
    Respuestas
    1. Hola qué tal? A qué te refieres con proyecto, arriba dejé los links para descargar el código, ahí los puedes consultar, o a qué te refieres, puedes explicarme más?

      Borrar
    2. Hay muchos códigos y no sabe cual es supongo

      Borrar
  4. Respuestas
    1. una disculpa, no me había dado cuenta que había error en los nombres, ya lo corrijo

      Borrar
  5. Me sale la siguiente excepción en la linea

    tr.setRowFilter(RowFilter.regexFilter(txtbuscar_agregar));

    por el .regexfilter !

    Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - Erroneous tree type:
    at inventario_sandra.Inventario_Sandra.filtrar_busqueda(Inventario_Sandra.java:35)

    ResponderBorrar
    Respuestas
    1. Subiré el código de nuevo, al parecer están caídos los links, y actualizaré a la versión 11 de jdk,

      Borrar
  6. disculpa, yo con un MouseListener hize que al darle clic a una fila se abra una nueva interfaz que contiene la informacion de la tabla pero al filtrar una fila con el buscador y darle clic en la casilla no se habre la informacion de la casilla que marque, si no la informacion de la casilla que en el orden normal deberia ir ¿me puedes ayudar?

    ResponderBorrar
    Respuestas
    1. En éste mismo proyecto, tengo la funcionalidad de que si le dan un click, es para seleccionar, y si son dos click seguidos, es para editar, revisa el gif que subiré, y puedes basarte de ese código para resolver tu problema

      Borrar