TableRowSorter: el que permite ordenar el JTable
Para que la tabla sea ordenable no necesitamos hacer grandes cosas. Basta con pasarle al
JTable una instancia de TableRowSorter. A partir de ese momento, haciendo click en la
cabecera de las columnas con el ratón, ordenaremos el JTable en orden ascendente o
descendente alternativamente según esa columna.
// Instanciamos nuestro modelo de datos, por ejemplo,
DefaultTableModel
// y lo metemos en el JTable
DefaultTableModel modelo = new DefaultTableModel();
JTable tabla = new JTable(modelo);
// Instanciamos el TableRowSorter y lo añadimos al JTable
TableRowSorter<TableModel> elQueOrdena = new
TableRowSorter<TableModel>(modelo);
[Link](elQueOrdena);
RowFilter: el que permite filtrar el JTable
Para el filtro, sólo tenemos que pasarle a nuestro TableRowSorter un RowFilter una columna
concreta, por medio del método setRowFilter(). Este RowFilter es el que dice si un valor de
esa columna (y por tanto la fila entera del JTable) pasa o no pasa el filtro. Si el valor de esa
columna no pasa el filtro, la fila entera no lo pasa y no será visible.
Podemos hacernos nuestros propios RowFilter heredando de esta clase e implementando su
método abstracto include(), pero RowFilter tiene varios métodos estáticos que nos
proporcionan los filtros habituales.
En nuestro ejemplo, usaremos un filtro regex, es decir, el dato pasa el filtro si cumple un
determinado patrón, que será muy simple: pasa el filtro si tiene un "2". Para obtener
dicho RowFilter, usamos el método [Link]().
Como primer parámetro se pasa una expresión regular (regex) que tiene que cumplir el dato
para pasar el filtro. En nuestro caso es un simple String con un "2" dentro.
Como segundo parámetro se pasa un entero para identificar la columna a la que se quiere
aplicar el filtro. La primera columna es el cero. En nuestro caso, lo haremos sobre la segunda
columna, así que pasaremos un 1.
[Link]([Link]("2", 1));
El código completo del ejemplo
Aquí un ejemplo con el código completo.
package [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
import [Link];
/**
* Ejemplo de uso de TableRowSorter y RowFilter.
*
* @author Chuidiang
*
*/
public class PruebaJTable {
private TableRowSorter<TableModel> modeloOrdenado;
/**
* main del ejemplo.
*
* @param args
*/
public static void main(String[] args) {
new PruebaJTable();
}
/**
* Instancia un JFrame con un JTable dentro y diez filas de
datos. Lleva un
* trozo de código comentado para poder reemplazar.
*/
public PruebaJTable() {
JFrame v = new JFrame("Prueba JTable");
// Modelo de datos, segunda columna Integer y primera
String. Los
// índices empiezan en cero.
DefaultTableModel modelo = new DefaultTableModel() {
@Override
public Class getColumnClass(int columna) {
if (columna == 1)
return [Link];
return [Link];
}
};
// Añadimos unos datos.
[Link]("columna 1");
[Link]("columna 2");
for (int i = 0; i < 10; i++) {
[Link](new Object[] { "" + i, 100 - i });
}
// Metemos el modelo ordenable en la tabla.
modeloOrdenado = new
TableRowSorter<TableModel>(modelo);
[Link](modeloOrdenado);
[Link]([Link]("2",
1));
// Lo pintamos todo en la ventana y la mostramos.
JTable tabla = new JTable(modelo);
JScrollPane scroll = new JScrollPane(tabla);
[Link]().add(scroll);
[Link]();
[Link](true);
[Link](WindowConstants.EXIT_ON_CLOSE);
}
}
Otros filtros ya construidos
RowFilter tiene además los siguientes métodos:
[Link]()
El que hemos visto en el ejemplo. El siguiente filtro hace que pasen las filas que en la primera
columna tengan un texto que empiece por "a" minúscula
[Link]("^a", 0);
[Link]()[editar]
Para fechas. El siguiente filtro haría que pasaran el filtro aquellas fechas anteriores a la actual
en la columna 2.
[Link]([Link], new Date(),1);
[Link]()[editar]
Para números. El siguiente filtro haría que pasaran el filtro las filas con un 10 en la primera
columna
[Link]([Link], 10, 0);
RowFilter and, or y not[editar]
Si hemos construido ya varios RowFilter cualesquiera y los tenemos metidos en un Iterable,
podemos hacer operaciones lógicas and, or y not con ellos
LinkedList<RowFilter> lista = new LinkedList<RowFilter>();
[Link]([Link](....));
[Link]([Link](....));
RowFilter filtroAnd = [Link](lista); // and de ambos
filtros
RowFilter filtroOr = [Link](lista); // or de ambos
filtros.
RowFilter filtroNo = [Link]([Link]());