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
相关产品推荐
相关产品推荐

