two*_*ate 7 java regex jtable rowfilter
我目前正在使用以下内容来过滤我的 JTable
RowFilter.regexFilter(
Pattern.compile(textField.getText(),
Pattern.CASE_INSENSITIVE).toString(), columns );
Run Code Online (Sandbox Code Playgroud)
我如何格式化textField
或过滤,如果我想过滤多个列,我可以这样做.现在我可以过滤多个列,但我的过滤器只能是其中一个列
一个例子可能有助于我的解释更好:
Name Grade GPA
Zac A 4.0
Zac F 1.0
Mike A 4.0
Dan C 2.0
Run Code Online (Sandbox Code Playgroud)
文本字段将包含Zac A
或类似的东西,如果columns
是,它将显示第一个Zac行int[]{0, 1}
.现在,如果我这样做,我什么也得不到.过滤器Zac
工作但我得到了两个Zac
.A
也有效,但我会得到Zac A 4.0
和Mike A 3.0
.
我希望我能很好地解释我的问题.如果你不明白,请告诉我.
Ala*_*ore 12
看起来您需要为每个列创建单独的过滤器并将它们与AndFilter组合,或者通过覆盖include()方法编写自己的过滤器.RegexFilter只需要一个指定的列匹配,似乎没有办法改变它.
顺便说一句,如果你想强制正则表达式忽略大小写,你应该添加(?i)
到它的开头.尽管您使用了CASE_INSENSITIVE标志,但您生成的字符串与您开始使用的字符串相同.
编辑:我链接的文档包含从两个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);
Run Code Online (Sandbox Code Playgroud)
此外,如果我接受过滤器文本作为用户输入(您似乎正在做),我可能会先引用它:
String regex = "(?i)^" + Pattern.quote(input) + "$";
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
这是一个非常简单的过滤器,它从文本框中获取所有文本,分割单词并动态创建许多过滤器.然后,将它们与一个andFilter结合起来,然后放回到表模型的分拣机.
归档时间: |
|
查看次数: |
19877 次 |
最近记录: |