2010-03-22 15 views
5

Ich bin derzeit mit der folgenden filtern meine JTableRowFilter.regexFilter mehrere Spalten

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

Wie formatiere ich meine textField oder Filter so, wenn ich mehrere Spalten filtern, will ich das tun kann. Im Moment kann ich mehrere Spalten auswählen, aber mein Filter kann nur von einem der Säulen

Ein Beispiel könnte meine Erklärung helfen, besser:

Name Grade GPA 
Zac A 4.0 
Zac F 1.0 
Mike A 4.0 
Dan C 2.0 

Das Textfeld ähnlich würde enthalten Zac A oder etwas und es würde zeigen, die erste Zac-Zeile, wenn columns war. Gerade jetzt, wenn ich das obige mache, bekomme ich nichts. Der Filter Zac funktioniert aber ich bekomme beide Zac 's. A funktioniert auch, aber ich würde dann Zac A 4.0 und Mike A 3.0 bekommen.

Ich hoffe, ich habe mein Problem gut erklärt. Bitte lass es mich wissen, wenn du es nicht verstehst.

Antwort

11

Sie müssen entweder einen separaten Filter für jede Spalte erstellen und sie mit einem AndFilter kombinieren oder einen eigenen Filter schreiben, indem Sie die Methode include() überschreiben. Ein RegexFilter benötigt nur eine der angegebenen Spalten, und es scheint keine Möglichkeit zu geben, dies zu ändern.

Übrigens, wenn Sie die Regex zwingen möchten, Groß-/Kleinschreibung zu ignorieren, sollten Sie (?i) an den Anfang davon hinzufügen. Die Zeichenfolge, die Sie generieren, ist die gleiche wie die, mit der Sie begonnen haben, obwohl Sie das Flag CASE_INSENSITIVE verwendet haben.

EDIT: Das Dokument, mit dem ich verknüpfte, enthält ein Beispiel zum Erstellen eines AndFilter aus zwei RegexFiltern, aber das Beispiel ist ziemlich dumm. Es erstellt einen Filter, der in einer beliebigen Spalte nach foo oder in einer beliebigen Spalte nach bar sucht - was genau dasselbe ist wie ein einzelner RegexFilter mit foo|bar als Regex und keine angegebenen Spalten. Ein gutes AndFilter-Beispiel sollte etwas tun, was nur ein AndFilter tun kann: Erzwinge Bedingungen auf zwei oder mehr Spalten gleichzeitig, so wie du es versuchst. Hier ist, wie ich würde filtern Fall-unsensibel für Zac in der ersten Spalte und A in den zweiten:

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

Auch wenn ich den Filtertext als Benutzereingabe wurde akzeptieren (die Sie scheinen zu tun ist), würde ich wahrscheinlich zitieren es zuerst:

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

Nur um klar zu sein, können Sie einen AndFilter zu einem anderen AndFilter richtig hinzufügen? Auch, wo füge ich die '(? I)' hinzu? Überall, wo ich es geschrieben habe, bekomme ich einen Fehler. – twodayslate

+0

Ein AndFilter ISA RowFilter, also sehe ich nicht, warum Sie nicht einen anderen hinzufügen können, aber ich sehe keinen Grund, dies hier zu tun. Siehe meine Bearbeitung, die auch das '(? I)' abdeckt. –

+0

Ich habe den unempfindlichen Fall zu arbeiten. Ich habe nicht die '^' oder '$' obwohl, nur die '(? I)' - es hat nicht anders funktioniert. Ich arbeite jetzt daran, den AndFilter zu machen. – twodayslate

1
RowFilter<TableModel, Object> filter = 
    RowFilter.orFilter(Arrays.asList(RowFilter.regexFilter(lookup,0), 
    RowFilter.regexFilter(lookup, 1))); 

oder

RowFilter<TableModel, Object> filter = 
    RowFilter.regexFilter(Pattern.compile(lookup,Pattern.CASE_INSENSITIVE).toString(),0,1); 

0 ein 1 nd sind die Spaltennummern

5

vom Oracle-Tutorial auf tables kombiniert und die Antwort von Alan, habe ich dies:

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 ist ein ziemlich einfacher Filter, der den gesamten Text aus einem Textfeld nimmt, teilt die Wörter und dynamisch erstellt viele Filter. Dann, kombinieren Sie sie mit einem andFilter und setzen Sie zurück zum Sortierer für das Tischmodell.