Search code examples
javaswingfilterjtablerowfilter

Java swing toggle button to filter jtable rows


I have a JTable, it contains a custom AbstractTableModel that return an object when getValueAt is called. And of course I have a custom TableCellRenderer that is capable of getting/constructing the text from the object so that it can be displayed.

However now I would like to write a filter. Filter will be a simple toggle button. When it is turned on I would like the filter to be applied and when it is turned off I would like filter to be removed.

I have two problems due to that.

First one is that I have absolutely no idea how to write a filter when you have to filter by object rather than a primitive.

Second is I have no idea how to attached the said filter to the toggle button to be able to turn it on and off.

I am sorry if this is a retarded question but http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#sorting was the most useless documentation I saw since explanation was not in depth.

Thanks to anyone for their help.

EDIT: The object contains multiple fields, but I am interested in two filter toggles specifically. One returns a boolean value when I say isSuper, and the second return a string when I call getName. If first toggle is turned on it should show all entries that return true on isSuper, and the second toggle should show all entries where name is compromised of two words (space is present) when I call getName.


Solution

  • To be honest, the JavaDocs spell it out quite well...

    With such little information to go on, the best you can hope for is an overview...

    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;
        }
    });
    

    When you want to update the filter, you simply need to call...

    trs.sort();