gpt4 book ai didi

java - "Concatenating"andFilter and orFilter for RowFilter

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:27:10 25 4
gpt4 key购买 nike

我有一个包含四列的 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))));

不幸的是,这不会产生任何可用的结果。任何想法表示赞赏:)

最佳答案

解决方案是向 JCheckBox 添加一个 ActionListener 以在复选框被切换时更新过滤器状态,并添加一个 DocumentListenerJTextField 的基础 Document 以在字段内容更新时更新过滤器状态。

您代码中的另一个错误是您在 bookFilter 实例上调用静态 andFilter 方法并且只传递新构造的正则表达式过滤器(即 你只是将一个参数传递给 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.
}
}

关于java - "Concatenating"andFilter and orFilter for RowFilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4226607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com