Java RowFilter.regexFilter多列
我目前正在使用以下内容筛选我的Java RowFilter.regexFilter多列,java,regex,jtable,rowfilter,Java,Regex,Jtable,Rowfilter,我目前正在使用以下内容筛选我的JTable RowFilter.regexFilter( Pattern.compile(textField.getText(), Pattern.CASE_INSENSITIVE).toString(), columns ); 如何格式化我的textField或filter,以便如果我想筛选多个列,我可以这样做。现在我可以过滤多个列,但我的过滤器只能是其中一列 举个例子可以帮助我更好地解释: Name Grade
JTable
RowFilter.regexFilter(
Pattern.compile(textField.getText(),
Pattern.CASE_INSENSITIVE).toString(), columns );
如何格式化我的textField
或filter,以便如果我想筛选多个列,我可以这样做。现在我可以过滤多个列,但我的过滤器只能是其中一列
举个例子可以帮助我更好地解释:
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
也可以工作,但我会得到ZacA4.0
和MikeA3.0
我希望我已经很好地解释了我的问题。如果您不理解,请告诉我。看起来您需要为每列创建一个单独的筛选器并将其与组合,或者通过重写该方法编写您自己的筛选器。RegexFilter只需要一个指定的列来匹配,而且似乎没有办法改变这一点 顺便说一下,如果您想强制正则表达式忽略大小写,您应该在它的开头添加
(?i)
。尽管使用了不区分大小写的标志,但生成的字符串与开始时的字符串相同
编辑:我链接到的文档包含一个从两个RegexFilter创建AndFilter的示例,但是这个示例非常愚蠢。它创建了一个过滤器,用于在任何列中查找foo
,或在任何列中查找bar
——这与单个RegexFilter完全相同,其中foo | bar
作为正则表达式且未指定任何列。一个好的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);
RowFilter过滤器=
RowFilter.orFilter(Arrays.asList)(RowFilter.regexFilter(lookup,0),
regexFilter(查找,1));
或
RowFilter过滤器=
regexFilter(Pattern.compile(查找,Pattern.CASE_不区分大小写).toString(),0,1);
0和1是列号通过结合oracle的教程和中的答案,我得出以下结论:
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);
RowFilter rf=null;
列表rfs=
新的ArrayList();
试一试{
String text=txtFilter.getText();
字符串[]textArray=text.split(“”);
对于(int i=0;i
这是一个非常简单的过滤器,它从一个文本框中提取所有文本,拆分单词并动态创建许多过滤器。然后,将它们与andFilter组合,并将其放回表格模型的分拣机。为了清楚起见,您可以将andFilter添加到另一个andFilter,正确吗?另外,在哪里添加
(?I)
?无论我把它放在哪里,我都会得到一个错误。AndFilter是RowFilter,所以我不明白为什么不能将一个添加到另一个,但我不认为有必要在这里这样做。请参阅我的编辑,它也涵盖了(?i)
。我使用了不敏感的大小写。但是我没有包括^
或$
,只包括(?I)
——否则它就不起作用了。现在正在制作和过滤器
。我创建了和过滤器
。它似乎工作得很好。谢谢你的帮助。
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);
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);