如何针对特定列过滤JTable? [英] How to filter JTable with respect to a specific column?

查看:49
本文介绍了如何针对特定列过滤JTable?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有JFrameJTable,并且JComboBox有选择

  • 离开代码"
  • 离开说明"

当在组合框中选择请假代码时,我需要针对请假代码过滤表数据,而在组合框中选择请假描述时,我需要针对假请求过滤表数据.

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

但是问题是它会按Leavedesc和LeaveCode排序,因此组合框无效.请帮助我实现基于列的过滤器.

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.

推荐答案

没有一个可运行的示例,我不能百分百确定,但是我想每次更改过滤器文本时设置RowSorter都会导致要重新排序的表.

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.

相反,在创建JTable时设置TableRowSorter并只需更新过滤器即可,例如...

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...

这篇关于如何针对特定列过滤JTable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆