我有一个带有四列的JTable,第一列包含数字或文本,另外三列包含文本。我试图在RowFilter的帮助下过滤这个表:
sorter = new TableRowSorter<TableModel>(myOwnTableModel);
我得到的checkboxFilter效果很好:
sorter.setRowFilter(RowFilter.regexFilter("^[0-9]$", 0));
此分拣机已激活或取消激活,具体取决于是否设置的复选框 如果用户在文本字段中放置一些文本,则会发生第二次过滤。就其本身而言,这已经很好了:
String regex = "(?i)" + Pattern.quote(s); // s = input Text of user
sorter.setRowFilter(RowFilter.regexFilter(regex, 1,2,3));
我不能做的是同时激活两个过滤器。也许我的想法太过分了,我的想法是“连接”两个过滤器,checkboxFilter应该是“和”另一个“或”。我尝试了几件事,对我来说最有希望看起来像是:
String regex = "(?i)" + Pattern.quote(s);
bookFilter = RowFilter.regexFilter(regex, 1,2,3);
sorter.setRowFilter(bookFilter.andFilter(Arrays.asList(
RowFilter.regexFilter("^[0-9]$", 0))));
不幸的是,这不会导致任何可用的结果。任何想法赞赏:)
答案 0 :(得分:4)
解决方案是向ActionListener
添加JCheckBox
以更新过滤器状态(如果切换复选框)并将DocumentListener
添加到JTextField
的基础如果字段内容已更新,则更新过滤器状态的文档。
您的代码中的另一个错误是您在andFilter
实例上调用静态bookFilter
方法,并且只传入新构造的正则表达式过滤器(即您只是传入andFilter
的一个参数。正确的用法是:
RowFilter andFilter = RowFilter.andFilter(filter1, filter2, etc);
示例事件监听器
JCheckBox cb = ...
cb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
updateFilters();
}
});
JTextField tf = ...
tf.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) { updateFilters(); }
public void removeUpdate(DocumentEvent e) { updateFilters(); }
publci void changedUpdate(DocumentEvent e) { updateFilters(); }
});
...然后定义你的updateFilters()方法,根据选中复选框的时间以及文本字段是否为空来安装新的过滤器。
示例过滤器更新方法
public void updateFilters() {
if (cb.isSelected()) {
if (tf.getText().length() > 0) {
// Both filters active so construct an and filter.
sorter.setRowFilter(RowFilter.andFilter(bookFilter, checkBoxFilter));
} else {
// Checkbox selected but text field empty.
sorter.setRowFilter(checkBoxFilter);
}
} else if (tf.getText().length() > 0) {
// Checkbox deselected but text field non-empty.
sorter.setRowFilter(bookFilter);
} else {
// Neither filter "active" so remove filter from sorter.
sorter.setRowFilter(null); // Will cause table to re-filter.
}
}