Jipin Gopi
Jipin Gopi

Reputation: 35

How to filter JTable with respect to a specific column?

I have JFrame with a JTable and JComboBox with choices

I need to filter the table data with respect to leave code when leave code is selected in the combo box and filter with respect to leavedesc when leave description is selected in the combo box.

This is the function that I've used to filter the data:

private void filtervalue(String filterString) {
    TableModel model = tableLeave.getModel();
    final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
    tableLeave.setRowSorter(sorter);
    if (filterString.length() == 0) {
        sorter.setRowFilter(null);
    } else {
        sorter.setRowFilter(RowFilter.regexFilter("(?i)" + filterString));
    }
}

But the problem is it will sort by leavedesc as well as leavecode, so no effect by the combo box. Please help me to implement column based filter.

Upvotes: 1

Views: 8416

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347332

Without a runnable example, I can't be 100% sure, but I would guess that setting the RowSorter each time you change the filter text is causing the table to be re-sorted.

Instead, set a TableRowSorter when you create the JTable and simply update the filter, for example...

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

public class TableFilter {

    public static void main(String[] args) {
        new TableFilter();
    }

    private JTable table;
    private JComboBox filterBy;
    private JTextField filterText;

    public TableFilter() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel(new Object[]{"Code", "Description"}, 0);
                model.addRow(new Object[]{"A001", "Holidays"});
                model.addRow(new Object[]{"B001", "Sick"});
                model.addRow(new Object[]{"A002", "Zombitse"});
                model.addRow(new Object[]{"C001", "Crazy bin"});
                model.addRow(new Object[]{"C002", "Postal"});
                model.addRow(new Object[]{"D002", "Job Interview"});
                model.addRow(new Object[]{"D004", "it's sunny outside"});

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

                JPanel filterPane = new JPanel(new GridBagLayout());
                filterBy = new JComboBox(new Object[]{"Nothing", "Code", "Description"});
                filterText = new JTextField(20);
                filterPane.add(filterBy);
                filterPane.add(filterText);

                filterBy.setSelectedIndex(0);
                filterBy.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        updateFilter();
                    }
                });

                filterText.getDocument().addDocumentListener(new DocumentListener() {
                    @Override
                    public void insertUpdate(DocumentEvent e) {
                        updateFilter();
                    }

                    @Override
                    public void removeUpdate(DocumentEvent e) {
                        updateFilter();
                    }

                    @Override
                    public void changedUpdate(DocumentEvent e) {
                        updateFilter();
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(filterPane, BorderLayout.NORTH);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    protected void updateFilter() {
        Object selected = filterBy.getSelectedItem();
        TableRowSorter<TableModel> sorter = (TableRowSorter<TableModel>) table.getRowSorter();
        String text = "(?i)" + filterText.getText();
        if ("Nothing".equals(selected)) {
            sorter.setRowFilter(null);
        } else {
            int col = -1;
            if ("Code".equals(selected)) {
                col = 0;
            } else if ("Description".equals(selected)) {
                col = 1;
            }
            sorter.setRowFilter(RowFilter.regexFilter(text, col));
        }
    }

}

This example demonstrates real time updates, so as you type, the table will be filtered...

Upvotes: 4

Related Questions