我目前正在使用以下内容过滤我的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
或类似内容,如果columns
是int[]{0, 1}
,它将显示Zac的第一行。现在,如果我执行上述操作,我将一无所获。过滤器Zac
可以工作,但是我都得到了Zac
。 A
也可以,但是我可以得到Zac A 4.0
和Mike A 3.0
。我希望我已经很好地解释了我的问题。如果您不明白,请告诉我。
最佳答案
看起来您要么需要为每列创建一个单独的过滤器,然后将它们与AndFilter结合起来,要么通过覆盖include()方法来编写自己的过滤器。 RegexFilter只需要指定的列之一即可匹配,并且似乎没有办法改变它。
顺便说一句,如果要强制正则表达式忽略大小写,则应在其开头添加(?i)
。尽管使用了CASE_INSENSITIVE标志,但生成的字符串与开始时使用的字符串相同。
编辑:我链接到的文档包含一个从两个RegexFilters创建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) + "$";