por - propiedades de jtable en java
RowFilter.regexFilter varias columnas (3)
Actualmente estoy usando lo siguiente para filtrar mi JTable
RowFilter.regexFilter(
Pattern.compile(textField.getText(),
Pattern.CASE_INSENSITIVE).toString(), columns );
¿Cómo formateo mi textField
o filtro, así que si quiero filtrar varias columnas puedo hacerlo? Ahora mismo puedo filtrar varias columnas pero mi filtro solo puede ser de una de las columnas
Un ejemplo podría ayudar mejor a mi explicación:
Name Grade GPA
Zac A 4.0
Zac F 1.0
Mike A 4.0
Dan C 2.0
El campo de texto contendría Zac A
o algo similar y mostraría la primera fila de Zac si las columns
fueran int[]{0, 1}
. Ahora mismo si hago lo anterior, no consigo nada. El filtro de Zac
funciona pero recibo los dos de Zac
. A
también funciona, pero luego obtendría Zac A 4.0
y Mike A 3.0
.
Espero haber explicado bien mi problema. Por favor, hágamelo saber si no entiende.
Parece que necesita crear un filtro separado para cada columna y combinarlos con un AndFilter , o escribir su propio filtro anulando el método include () . Un RegexFilter solo requiere que una de las columnas especificadas coincida, y no parece haber una manera de cambiar eso.
Por cierto, si quiere obligar a la expresión regular a ignorar el caso, debe agregar (?i)
al principio. La cadena que está generando es la misma que la que comenzó, a pesar del uso de la bandera CASE_INSENSITIVE.
EDITAR: El documento al que he vinculado contiene un ejemplo de creación de un AndFilter a partir de dos RegexFilters, pero el ejemplo es bastante tonto. Crea un filtro que busca foo
en cualquier columna o bar
en cualquier columna, que es exactamente lo mismo que un solo RegexFilter con foo|bar
como la expresión regular y sin columnas especificadas. Un buen ejemplo de AndFilter debería hacer algo que solo AndFilter puede hacer: imponer condiciones en dos o más columnas a la vez, como lo está intentando hacer. Así es como filtraría las mayúsculas y minúsculas para Zac
en la primera columna y A
en la segunda:
List<RowFilter<Object,Object>> rfs =
new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter("(?i)^Zac$", 0));
filters.add(RowFilter.regexFilter("(?i)^A$", 1));
RowFilter<Object,Object> af = RowFilter.andFilter(rfs);
Además, si aceptara el texto de filtro como entrada del usuario (que parece que está haciendo), probablemente lo citaría primero:
String regex = "(?i)^" + Pattern.quote(input) + "$";
RowFilter<TableModel, Object> filter =
RowFilter.orFilter(Arrays.asList(RowFilter.regexFilter(lookup,0),
RowFilter.regexFilter(lookup, 1)));
o
RowFilter<TableModel, Object> filter =
RowFilter.regexFilter(Pattern.compile(lookup,Pattern.CASE_INSENSITIVE).toString(),0,1);
0 y 1 son los números de columna
Al combinar el tutorial del oráculo sobre tablas y la respuesta de Alan , hice esto:
RowFilter<PublicationTableModel, Object> rf = null;
List<RowFilter<Object,Object>> rfs =
new ArrayList<RowFilter<Object,Object>>();
try {
String text = txtFilter.getText();
String[] textArray = text.split(" ");
for (int i = 0; i < textArray.length; i++) {
rfs.add(RowFilter.regexFilter("(?i)" + textArray[i], 0, 1, 2, 4));
}
rf = RowFilter.andFilter(rfs);
} catch (java.util.regex.PatternSyntaxException e) {
return;
}
sorter.setRowFilter(rf);
Es un filtro bastante simple que toma todo el texto de un cuadro de texto, divide las palabras y crea dinámicamente muchos filtros. Luego, combinándolos con un andFilter y regresando al clasificador para el modelo de tabla.