Как отфильтровать JTable по конкретному столбцу?

1

У меня есть JFrame с JTable и JComboBox с выборами

  • "Оставить код"
  • "Оставить описание"

Мне нужно отфильтровать данные таблицы относительно кода отпуска, когда в поле со списком выбран код отпуска и фильтр по отношению к leavedesc, когда в поле со списком выбрано описание отпуска.

Это функция, которую я использовал для фильтрации данных:

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

Но проблема в том, что он будет сортировать по leavedesc, а также по leavecode, поэтому никакого эффекта в поле со списком не будет. Пожалуйста, помогите мне реализовать фильтр на основе столбцов.

  • 2
    Подумайте о предоставлении работающего примера, который демонстрирует вашу проблему. Это приведет к меньшему беспорядку и лучшим ответам
  • 0
    Ваш фильтр будет фильтровать ВСЕ столбцы, вы должны предоставить индекс (ы) столбцов, которые вы хотите фильтровать по ...
Показать ещё 1 комментарий
Теги:
swing
jtable

1 ответ

3
Лучший ответ

Без запускаемого примера я не могу быть на 100% уверенным, но я бы предположил, что установка RowSorter каждом изменении текста фильтра приводит к повторной сортировке таблицы.

Вместо этого установите TableRowSorter при создании JTable и просто обновите фильтр, например...

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

}

В этом примере демонстрируются обновления в реальном времени, так как вы печатаете, таблица будет отфильтрована...

  • 0
    хмммм - How to filter JTable with respect to a specific column? ! = TableRowSorter , вы читали filtering from JComboBox ( and и nor в RowFilter)
  • 0
    @mKorbel "Мне нужно отфильтровать данные таблицы по отношению к коду выхода, когда в поле со списком выбран код выхода, и отфильтровать по отношению к листьями, когда описание выбрано в поле со списком" - Итак, когда выбран "код", данные будут отфильтрованы в соответствии только с reg-expr ТОЛЬКО для столбца кода и то же самое для описания ... В отличие от кода ОП, который фильтруется по ВСЕМ столбцам ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню