RowFilter.regexFilter多列

时间:2010-03-22 18:46:05

标签: java regex jtable rowfilter

我目前正在使用以下内容过滤我的JTable

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

如何格式化textField或过滤器,如果我想过滤多个列,我可以这样做。现在我可以过滤多个列,但我的过滤器只能是其中一列

一个例子可能会更好地帮助我解释:

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

文本字段将包含Zac A或类似内容,如果columnsint[]{0, 1},则会显示第一个Zac行。现在,如果我这样做,我什么也得不到。过滤器Zac有效,但我同时获得Zac个。 A也可以,但我会得到Zac A 4.0Mike A 3.0

我希望我能很好地解释我的问题。如果您不理解,请告诉我。

3 个答案:

答案 0 :(得分:11)

看起来您需要为每个列创建单独的过滤器并将它们与AndFilter结合使用,或者通过覆盖include()方法编写自己的过滤器。 RegexFilter只需要一个指定的列匹配,似乎没有办法改变它。

顺便说一句,如果你想强制正则表达式忽略大小写,你应该在它的开头添加(?i)。尽管您使用了CASE_INSENSITIVE标志,但您生成的字符串与您开始使用的字符串相同。

编辑:我链接的文档包含一个从两个RegexFilter创建AndFilter的示例,但这个例子非常愚蠢。它会创建一个过滤器,在任何列中查找foo或在任何列中查找bar - 这与使用foo|bar作为正则表达式并且未指定列的单个RegexFilter完全相同。一个好的AndFilter示例应该只做AndFilter可以做的事情:一次强制执行两个或多个列的条件,就像你想要做的那样。以下是我在第一列中对Zac和第二列中的A不区分大小写的过滤方式:

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

另外,如果我接受过滤器文本作为用户输入(你似乎在做),我可能会先引用它:

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

答案 1 :(得分:5)

通过结合tables上的oracle教程和Alan的答案,我做到了这一点:

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

这是一个非常简单的过滤器,它从文本框中获取所有文本,分割单词并动态创建许多过滤器。然后,将它们与一个andFilter结合起来,然后放回到表模型的分拣机。

答案 2 :(得分:1)

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

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

0和1是列号