用于筛选jtable行的Java swing切换按钮

用于筛选jtable行的Java swing切换按钮,java,swing,filter,jtable,rowfilter,Java,Swing,Filter,Jtable,Rowfilter,我有一个JTable,它包含一个自定义AbstractTableModel,在调用getValueAt时返回一个对象。当然,我有一个定制的TableCellRenderer,它能够从对象中获取/构造文本,以便显示 但是现在我想写一个过滤器。过滤器将是一个简单的切换按钮。当它打开时,我希望应用过滤器,当它关闭时,我希望删除过滤器 因此我有两个问题 首先,我完全不知道当你必须按对象而不是原语进行过滤时,如何编写过滤器 第二,我不知道如何将所述过滤器连接到切换按钮,以便能够打开和关闭它 我很抱歉,如果

我有一个
JTable
,它包含一个自定义
AbstractTableModel
,在调用
getValueAt
时返回一个对象。当然,我有一个定制的
TableCellRenderer
,它能够从对象中获取/构造文本,以便显示

但是现在我想写一个过滤器。过滤器将是一个简单的切换按钮。当它打开时,我希望应用过滤器,当它关闭时,我希望删除过滤器

因此我有两个问题

首先,我完全不知道当你必须按对象而不是原语进行过滤时,如何编写过滤器

第二,我不知道如何将所述过滤器连接到切换按钮,以便能够打开和关闭它

我很抱歉,如果这是一个弱智的问题,但这是我看到的最无用的文件,因为解释不够深入

感谢所有人的帮助

编辑: 该对象包含多个字段,但我对两个过滤器切换特别感兴趣。当我说
isSuper
时,一个返回一个
boolean
值,当我调用
getName
时,第二个返回一个
字符串。如果第一个切换被打开,它应该显示在
isSuper
上返回true的所有条目,而第二个切换应该显示当我调用
getName
时名称被两个单词(空格存在)折中的所有条目

首先,我完全不知道当你必须按对象而不是原语进行过滤时,如何编写过滤器

您是否阅读了
RowFilter
API?它显示了如何基于自定义对象创建自定义过滤器的示例

第二,我不知道如何将所述过滤器连接到切换按钮,以便能够打开和关闭它

您是否阅读了教程并尝试运行演示?本教程使用DocumentFilter在用户每次更改文本字段中的文本时动态更改过滤器。因此,本教程将向您展示如何根据用户输入动态更改过滤器。您可以修改代码,以便在每次按下切换按钮时更改过滤器

它包含一个自定义的AbstractTableModel,在调用getValueAt时返回一个对象。当然,我有一个定制的TableCellRenderer,它能够从对象中获取/构造文本,以便显示

与我的回答无关,但我真的不明白那句话。您是说模型中的每个单元格都返回不同的对象,还是每个单元格都返回相同的对象,但您只是为column1、column2、column3等显示对象的不同属性?不管怎样,这听起来像是一个奇怪的设计。我们或许可以提出更好的建议。发布您的SSCCE以演示问题

首先,我完全不知道当你必须按对象而不是原语进行过滤时,如何编写过滤器

您是否阅读了
RowFilter
API?它显示了如何基于自定义对象创建自定义过滤器的示例

第二,我不知道如何将所述过滤器连接到切换按钮,以便能够打开和关闭它

您是否阅读了教程并尝试运行演示?本教程使用DocumentFilter在用户每次更改文本字段中的文本时动态更改过滤器。因此,本教程将向您展示如何根据用户输入动态更改过滤器。您可以修改代码,以便在每次按下切换按钮时更改过滤器

它包含一个自定义的AbstractTableModel,在调用getValueAt时返回一个对象。当然,我有一个定制的TableCellRenderer,它能够从对象中获取/构造文本,以便显示

与我的回答无关,但我真的不明白那句话。您是说模型中的每个单元格都返回不同的对象,还是每个单元格都返回相同的对象,但您只是为column1、column2、column3等显示对象的不同属性?不管怎样,这听起来像是一个奇怪的设计。我们或许可以提出更好的建议。发布您的SSCE,以演示问题。

老实说,这篇文章很好地解释了问题

有了这么少的信息,你能期望的最好的是一个概述

TableRowSorter<TableModel> trs = new TableRowSorter<TableModel>();
table.setRowSorter(trs);

// Create the row filder...
trs.setRowFilter(new RowFilter<TableModel, Integer>() {

    @Override
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
        boolean include = false;
        // Returns the value for the specific column...
        CustomObject value = (CustomObject)entry.getValue(filterColumn);
        if (filterBySuper) {
            include = value.isSuper();
        } else {
            include = value.getName().startsWith(fistPart) && value.getName().endWith(lastPart);
        }
        return include;
    }
});
老实说,他们把它说得很清楚

有了这么少的信息,你能期望的最好的是一个概述

TableRowSorter<TableModel> trs = new TableRowSorter<TableModel>();
table.setRowSorter(trs);

// Create the row filder...
trs.setRowFilter(new RowFilter<TableModel, Integer>() {

    @Override
    public boolean include(RowFilter.Entry<? extends TableModel, ? extends Integer> entry) {
        boolean include = false;
        // Returns the value for the specific column...
        CustomObject value = (CustomObject)entry.getValue(filterColumn);
        if (filterBySuper) {
            include = value.isSuper();
        } else {
            include = value.getName().startsWith(fistPart) && value.getName().endWith(lastPart);
        }
        return include;
    }
});

您试图筛选的对象是什么样子的?你想在哪个属性上进行筛选?@MadProgrammer刚刚用Edit更新了这个问题:)我只需要两个切换就可以了。你想筛选的对象看起来像什么?你想在什么属性上进行筛选?@MadProgrammer刚刚用Edit更新了这个问题:)我只需要两个切换就可以了。我最大的问题是输入。我不知道它代表给定行中的对象。哇,非常感谢:)这是一个惊人的帮助,你应该同时使用教程和Java文档。我还只是简单地测试项目,看看传递了什么,这样我就可以将信息量化到上下文状态中——但我就是这样愚蠢;)我最大的问题是进入。我不知道它代表给定行中的对象。哇,非常感谢:)这是一个惊人的帮助,你应该同时使用教程和Java文档。我还只是简单地测试项目,看看传递了什么,这样我就可以将信息量化到上下文状态中——但我就是这样愚蠢;)