You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java Swing表格如何设置多个RowFilter实现多条件数据过滤

Swing JTable 多列组合过滤实现方案

现有代码问题

  • 过滤器覆盖:setRowFilter每次调用会覆盖上一次设置的规则,因此单列过滤代码无法同时生效
  • 逻辑位置错误:TableRowSorter初始化、排序规则配置、输入框监听器绑定被放在keyPressed回调中,每次按键都会重复创建对象、重复绑定监听器,产生冗余逻辑
  • 未做组合过滤:Swing的RowFilter原生支持多规则组合,不需要重复调用setRowFilter

修正实现

首先把初始化逻辑和过滤逻辑拆分,初始化操作仅在界面加载时执行一次,过滤逻辑在输入框内容变化时触发,通过RowFilter.andFilter()组合多列过滤规则,实现多条件同时匹配的筛选效果。

// 界面初始化阶段调用,仅执行一次
private void initTableConfig() {
    trs = new TableRowSorter(dtm);
    table.setRowSorter(trs);

    // 配置默认排序规则
    List<RowSorter.SortKey> sortKeys = new ArrayList<>();
    sortKeys.add(new RowSorter.SortKey(2, SortOrder.ASCENDING));
    trs.setSortKeys(sortKeys);
    trs.sort();

    // 给所有过滤输入框绑定统一的触发监听器
    KeyAdapter filterTrigger = new KeyAdapter() {
        @Override
        public void keyReleased(KeyEvent e) {
            refreshFilter();
        }
    };
    textFecha.addKeyListener(filterTrigger);
    txtfiltro.addKeyListener(filterTrigger);
}

// 刷新多列组合过滤器
private void refreshFilter() {
    List<RowFilter<Object, Object>> filterList = new ArrayList<>();

    // 第0列过滤规则:输入内容非空时加入规则链
    String col0Input = textFecha.getText().trim();
    if (!col0Input.isEmpty()) {
        filterList.add(RowFilter.regexFilter("(?i)" + col0Input, 0));
    }

    // 第1列过滤规则:输入内容非空时加入规则链
    String col1Input = txtfiltro.getText().trim();
    if (!col1Input.isEmpty()) {
        filterList.add(RowFilter.regexFilter("(?i)" + col1Input, 1));
    }

    // 组合所有规则:所有列条件同时匹配的行才会显示
    trs.setRowFilter(RowFilter.andFilter(filterList));
}

扩展说明

  • 如果需要「任意一列匹配输入内容就显示行」的或逻辑筛选,把组合方法从RowFilter.andFilter()替换为RowFilter.orFilter()即可
  • 后续新增列过滤只需要在refreshFilter()方法中追加对应输入框的取值和规则添加逻辑即可,不需要修改其他代码
  • 记得删除原keyPressed方法中写的初始化、监听器绑定、排序相关代码,避免重复执行

内容的提问来源于stack exchange,提问作者Cristian Carlos Bacarreza Cast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 03:12:18