tabla propiedades por ordenar numericamente hacer filtro filtrar ejemplo datos como busqueda java regex jtable rowfilter

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.