您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

按钮以筛选JTable的复选框处于选中状态

按钮以筛选JTable的复选框处于选中状态

让我们重新阅读教程“如何使用表:排序和过滤”

除了对结果重新排序之外,表排序器还可以指定将显示哪些行。这称为过滤。TableRowSorter使用javax.swing.RowFilter对象实现过滤。RowFilter实现几种创建通用过滤器的工厂方法

要看的东西:

RowFilter javadoc

javax.swing.RowFilter<M,I>

类型参数:M-模型的类型;例如PersonModelI-标识符的类型;使用时TableRowSorter将是Integer

好的,因此我们知道两件事。创建custom时RowFilter,应将TableModel类型作为第一个参数,并键入Integer以代表行号。

RowFilter用于过滤模型中的条目,以使它们不会显示在视图中。例如,与的RowFilter关联JTable可能只允许包含具有特定字符串的列的行。条目的含义取决于组件类型。例如,当过滤器与关联时JTable,条目对应于一行;当与a关联时JTree,条目对应于一个节点。

子类必须重写此include方法,以指示是否应在视图中显示该条目。该Entry参数可用于获取该条目中每个列中的值

因此,基于这两个参数,我们知道了RowFilter用来过滤视图中不需要的行,并且如果我们创建自己的行,则需要重写该include方法以返回是否应显示行。 。而且该include方法还将具有一个Entry参数,当确定哪一行不返回true时,我们可以从中获取我们可能感兴趣的详细信息。这是javadoc给我们的基本示例(准则)

RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
    @Override
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
        // do your logic here to return true or false.
    }
};

很酷,但是什么是此类RowFilter.Entry,它可以为我们提供什么有趣的信息?让我们看一下javadoc

我们可以看到的一件有趣的事情是getModel()方法。由此我们可以得到表模型。现在让我们完成实施

private static final int CHECK@R_163_2419@_COLUMN = 4;
...
RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
    @Override
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
        int modelRow = entry.getIdentifier();
        Boolean checked = (Boolean)entry.getModel().getValueAt(modelRow, CHECK@R_163_2419@_COLUMN);
        return checked;
    }
};

也不多。现在,剩下的就是使用正则表达式过滤器,将过滤器设置为排序器,正如您已经从Oracle教程中学到的那样。

这是填充演示代码。它没有ActionListener为按钮按下实现。我不想为你做 任何事情 。您应该有足够的信息来自己处理:-D快乐学习!

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TableBooleanFilterDemo {

    public TableBooleanFilterDemo() {
        JTable table = getTable();
        TableRowSorter<TableModel> rowSorter = new TableRowSorter<>(table.getModel());
        RowFilter filter = getRowFilter();
        rowSorter.setRowFilter(filter);
        table.setRowSorter(rowSorter);

        JFrame frame = new JFrame();
        frame.add(new JScrollPane(table));
        frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private static final int CHECK@R_163_2419@_COLUMN = 4;

    private RowFilter getRowFilter() {
        RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() {
            @Override
            public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
                int modelRow = entry.getIdentifier();
                Boolean checked = (Boolean)entry.getModel().getValueAt(modelRow, CHECK@R_163_2419@_COLUMN);
                return checked;
            }
        };
        return filter;
    }

    private JTable getTable() {
        Object[][] data = {
            {"Kathy", "Smith",
                "SNowboarding", new Integer(5), new Boolean(false)},
            {"John", "Doe",
                "Rowing", new Integer(3), new Boolean(true)},
            {"Sue", "Black",
                "Knitting", new Integer(2), new Boolean(false)},
            {"Jane", "White",
                "Speed reading", new Integer(20), new Boolean(true)},
            {"Joe", "Brown",
                "Pool", new Integer(10), new Boolean(false)}
        };
        String[] columnNames = {"First Name",
            "Last Name",
            "Sport",
            "# of Years",
            "Vegetarian"};
        return new JTable(new DefaultTableModel(data, columnNames) {
            public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
        });
    }

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

老实说,我从来不需要实现自己的方法RowFilter,但是以上就是我尝试学习新东西时要经历的过程。让我花了更长的时间写这个答案,然后学习如何做。要学会阅读文档,而不仅仅是教程。教程是一个很好的起点,但是一旦您遇到更复杂的问题,就需要更深入地研究。与您要学习的任何新技术相同。

其他 2022/1/1 18:27:04 有587人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶