2010-03-22 41 views
5

actualmente estoy usando lo siguiente para filtrar mi JTableRowFilter.regexFilter varias columnas

RowFilter.regexFilter( 
     Pattern.compile(textField.getText(), 
     Pattern.CASE_INSENSITIVE).toString(),  columns); 

¿Cómo formateo mi filtro textField o así que si quiero filtrar varias columnas que puedo hacer eso. Ahora mismo realizar un filtrado varias columnas pero mi filtro sólo puede ser de una de las columnas

Un ejemplo puede ayudar a mi mejor 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 sería una muestra de la primera fila de Zac si columns fue int[]{0, 1}. Ahora mismo si hago lo anterior, no consigo nada. El filtro Zac funciona pero obtengo ambos 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.

Respuesta

11

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 forzar 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. Se crea un filtro que busca foo en cualquier columna o bar en cualquier columna - que es exactamente lo mismo que con un solo RegexFilter foo|bar como la expresión regular y no hay 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. Aquí es cómo iba a filtrar mayúsculas y minúsculas para Zac en la primera columna y A en el segundo:

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); 

También, si estuviera aceptando el texto del filtro como la entrada del usuario (que parece que están haciendo), lo haría probablemente citar en primer lugar:

String regex = "(?i)^" + Pattern.quote(input) + "$"; 
+0

Para que quede claro, se puede añadir una AndFilter a otro AndFilter correcta? Además, ¿dónde agrego '(? I)'? Dondequiera que lo haya puesto, obtengo un error. – twodayslate

+0

Un RowFilter ISF de AndFilter, por lo que no veo por qué no podría agregar uno a otro, pero no veo la necesidad de hacerlo aquí. Ver mi edición, que cubre el '(? I)' también. –

+0

Tengo la carcasa insensible para trabajar. Sin embargo, no incluí el '^' o el '$', solo el '(? I)' - no funcionó de otra manera. Trabajando en hacer el 'AndFilter' ahora. – twodayslate

1
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 una nd 1 son los números de columna

5

Mediante la combinación de tutorial del oráculo de tables 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 muy simple que toma todo el texto de un cuadro de texto, divide la palabras y crea dinámicamente muchos filtros. Entonces, la combinación de ellos con un andFilter y puesta en volver a la clasificadora para el modelo de mesa.