Java - Filtrar datos de un JTable

 
Vista:

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 19/10/2019 07:23:17
Hola, el tema es que tengo una base de datos SQL que se conecta a un JTable para mostrar en las filas de la tabla cada registro de la base de datos. Y como dice el título, necesito un método que me permita filtrar los datos de la base de datos (o directamente de la tabla si fuera posible, es lo mismo) en función de las palabras que introduzca en unos TextField que tengo específicamente para eso.

He conseguido hacerlo mediante TableRowSorter y regexFilter pero no quiero hacerlo así ya que me hace una consulta cada vez que introduzco un caracter en el TextField, y yo lo que quiero en todo caso es que me haga la consulta a la base de datos sólo cuando le doy a un botón que invoca el método de filtrar, pero me estoy haciendo un lio con todo esto. Así que primero de todo me gustaría saber, ¿existe alguna manera de buscar directamente en la JTable para no tener que hacer otra consulta a la base de datos? me podría simplificar bastante el asunto.

Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 19/10/2019 15:05:58
Como digo eso lo conocía y me funcionaba pero si lo pongo en los cuadros de texto con un evento keyReleased me hace un montón de consultas (una cada vez que escribo un carácter) y no me interesa; y si lo pongo en un botón como quiero hacerlo con un evento actionPerformed, simplemente no me funciona. ¿Hay algo que pueda cambiar para que me funcione al presionar el botón? dejo el código del método.

1
2
3
4
5
6
7
private void filtro(String consulta, JTable jtableBuscar){
    DefaultTableModel modelo = new DefaultTableModel();
    modelo = (DefaultTableModel) jtableBuscar.getModel();
    TableRowSorter<DefaultTableModel> tr = new TableRowSorter<>(modelo);
    jtableBuscar.setRowSorter(tr);
    tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarM.getText(), 1));
}


Y este es el código que tengo en el botón:

1
2
3
4
5
6
7
8
JButton btnFiltrar = new JButton("Filtrar");
btnFiltrar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        filtro(TextField_BuscarM.getText(), table);
    }
});
btnFiltrar.setBounds(328, 209, 89, 23);
frame.getContentPane().add(btnFiltrar);

Gracias!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 19/10/2019 17:14:49
Vale a ver me estaba haciendo un lio ahora sí me funciona al presionar el botón, pero me busca sólo en uno de los TextField que tengo, concretamente en el último que le meto (invoco al método 5 veces al presionar el botón, una para cada TextField).

1
2
3
4
5
6
7
private void filtro(String consulta, JTable jtableBuscar, int NColumna){
    DefaultTableModel modelo = new DefaultTableModel();
    modelo = (DefaultTableModel) jtableBuscar.getModel();
    TableRowSorter<DefaultTableModel> tr = new TableRowSorter<>(modelo);
    jtableBuscar.setRowSorter(tr);
    tr.setRowFilter(RowFilter.regexFilter(consulta, NColumna));
}

1
2
3
4
5
6
7
8
9
10
11
12
JButton btnFiltrar = new JButton("Filtrar");
btnFiltrar.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        filtro (TextField_BuscarMar.getText(), table, 1);
        filtro (TextField_BuscarMod.getText(), table, 2);
        filtro (TextField_BuscarCol.getText(), table, 3);
        filtro (TextField_BuscarCon.getText(), table, 4);
        filtro (TextField_BuscarPre.getText(), table, 5);
    }
});
btnFiltrar.setBounds(328, 209, 89, 23);
frame.getContentPane().add(btnFiltrar);

Las columnas están bien puestas ya que la columna 0 es la de la ID, y en esa no se busca nada. ¿A alguien se le ocurre por qué solo me busca según la última invocación que haga? es decir, si pongo la columna 1 como la última invocación solo me busca por esa, si pongo la columna 5 como está en el código que he pasado, sólo me busca por esa otra, etc.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Tom (1831 intervenciones) el 19/10/2019 17:38:17
Pero ¿ qué quieres filtrar ? ¿ cuales son las condiciones ?
Y ¿ por qué estás creando nuevos TableModel y TableRowSorter cada vez ? Es normal que los filtros se estén "reseteando" cada vez ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 19/10/2019 19:07:34
Pues quiero filtrar las filas de la JTable según una serie de características, una por cada columna de la tabla. Y quiero que se hagan esos filtros uno sobre otros, de manera que por ejemplo, si hay dos coches amarillos en la base de datos pero uno es de un precio de 20.000 euros y otro es de un precio de 15.000, el filtro me permitirá coger el TextField correspondiente al color, en el cual escribiré "amarillo" y en el correspondiente al precio en el cual escribiré "15.000" y me saldrá sólo el coche amarillo de precio 15.000 y no también el amarillo de 20.000 o todos los que valgan 15.000 y sean de otro color.

Hay 5 características para filtrar, y por eso tengo 5 TextField. El TextField_Pre.getText() te da un String que permite hacer el filtrado del precio, por ejemplo. Ahora lo he puesto todo en el botón para ver si así funcionaba al no crear todo el rato el TableModel y el TableRowSorter, pero sigue ocurriendo lo mismo, sólo hace el filtro sobre el último que aparece en el código, que ahora mismo en este código es TextField_BuscarPre.getText(). O mejor dicho, hace todos los filtros pero uno detrás de otro y no a la vez, con lo que sólo se muestra el último.

Código del botón con este cambio que he hecho (he fusionado el método y el botón porque no sabía ponerlo de otra forma):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
JButton btnFiltrar = new JButton("Filtrar");
		btnFiltrar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				DefaultTableModel modelo = new DefaultTableModel();
		        modelo = (DefaultTableModel) table.getModel();
		        TableRowSorter<DefaultTableModel> tr = new TableRowSorter<>(modelo);
		        table.setRowSorter(tr);
		        tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarMar.getText(), 1));
		        tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarMod.getText(), 2));
		        tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarCol.getText(), 3));
		        tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarCon.getText(), 4));
		        tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarPre.getText(), 5));
			}
		});
		btnFiltrar.setBounds(328, 209, 89, 23);
		frame.getContentPane().add(btnFiltrar);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Tom (1831 intervenciones) el 19/10/2019 20:04:42
No sé si te has parado a pensar ... ¿ No crees que deberías usar un único filtro que comprobara las 5 condiciones (en lugar de 5 filtros en secuencia, cosa que no vale para nada, porque solo se aplica el último) ?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 19/10/2019 20:22:33
Lo he pensando, pero no sé como hacerlo, me puedes decir cómo lo harías?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por jimi (1 intervención) el 27/10/2020 03:49:10
1
tr.setRowFilter(RowFilter.regexFilter(TextField_BuscarMar.getText(), 1,2,3,4.....));
asi
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Filtrar datos de un JTable

Publicado por Juan (6 intervenciones) el 20/10/2019 02:45:09
Bueno pueshe conseguido hacer algo parecido a lo que quería de otra forma así que creo que voy a abandonar ese código, gracias de todos modos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar