基于具有相同数据的两个不同列的值的 JTable 行过滤

问题描述

我有一个 JTable 的数据如下:

------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data |    9  |  0    |
| Data |   17  |  24   |
| Data |    0  |  0    |
| Data |    0  |  5    |
------------------------

我有一个 RowFilter 必须隐藏在行 Num 1Num 2 上包含 0 的行!

sorter = new tablerowsorter<>(((model)));

List<RowFilter<Object,Object>> rfs = new ArrayList<>(2);

String regexHider1 = "(?i)^" + "0" + "$";
String regexHider2 = "(?i)^" + "0" + "$";

rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1,1)));
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1,2)));

RowFilter<Object,Object> af = RowFilter.andFilter(rfs);

sorter.setRowFilter(af);

jTable1.setRowSorter(sorter);

输出是:

------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data |   17  |  24   |
------------------------

但我需要的是隐藏 Num 1Num 2 是否都包含 0 !

我需要的是以下内容

------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data |    9  |  0    |
| Data |   17  |  24   |
| Data |    0  |  5    |
------------------------

仅隐藏 1 行,因为只有 1 行在 Num1 和 Num2 上包含 0

示例代码

package Classes;

import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.RowSorter;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.tablerowsorter;

public class JTableExample {

    DefaultTableModel model = new DefaultTableModel();

    public JFrame frame = new JFrame();

    public RowSorter<TableModel> sortert = new tablerowsorter<>(model);

    public tablerowsorter<TableModel> sorter = new tablerowsorter<TableModel>(((model)));

    public JTableExample() {

        String[] cols = {"Name","Num 1","Num 2"};

        JTable table = new JTable(model);

        table.setModel(model);
        model.setColumnIdentifiers(cols);

        model.addRow(new Object[]{"Data",9,0});
        model.addRow(new Object[]{"Data",17,24});
        model.addRow(new Object[]{"Data",5});

        JButton btn = new JButton();

        btn.setText("Filter");

        btn.addActionListener((e) -> {

            sorter = new tablerowsorter<>(((model)));

            List<RowFilter<Object,Object>> rfs = new ArrayList<>(2);

            String regexHider1 = "(?i)^" + "0" + "$";
            String regexHider2 = "(?i)^" + "0" + "$";

            rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1,1)));
            rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider2,2)));

            RowFilter<Object,Object> af = RowFilter.andFilter(rfs);

            sorter.setRowFilter(af);

            table.setRowSorter(sorter);

        });

        JPanel jdb = new JPanel();

        jdb.setLayout(new FlowLayout());

        jdb.add(table);
        jdb.add(btn);
        jdb.add(table);

        frame.add(jdb);

        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeto(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokelater(new Runnable() {
            public void run() {
                new JTableExample();
            }
        });
    }
}

解决方法

看起来“notFilter”用在了错误的地方。这似乎有效:

List<RowFilter<Object,Object>> rfs = new ArrayList<>(2);
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL,1));
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL,2));
RowFilter<Object,Object> af = RowFilter.andFilter(rfs);

sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter(  RowFilter.notFilter(af) );
table.setRowSorter(sorter);

我还尝试过使用自定义 RowFilter:

RowFilter<Object,Object> rf = new RowFilter<Object,Object>()
{
    public boolean include(Entry<? extends Object,? extends Object> entry)
    {
        Integer column1 = (Integer)entry.getValue(1);
        Integer column2 = (Integer)entry.getValue(2);

        if (column1.intValue() == 0 && column2.intValue() == 0)
            return false;
        else
            return true;
    }
};

sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter(rf);
table.setRowSorter(sorter);

注意:在这两种情况下,过滤器都需要整数数据,因此如果您编辑列并将值更改为 0,它将不起作用,因为模型将使用字符串值更新。我假设您真正的 TableModel 会覆盖 getColumnClass() 方法以返回最后 2 列的 Integer.class。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...