简体   繁体   English

如何使用RowSorter JTable搜索两个值

[英]how to search two values using RowSorter JTable

when i select Class and Section from ComboBox then it will have to search Jtable for specific class and Section and show only those class and section? 当我从ComboBox中选择Class和Section时,它将不得不在Jtable中搜索特定的Class和Section并仅显示那些Class和Section?

在此处输入图片说明

Instead of using additional comboboxes for searching, try using SwingBits Library for your code. 代替使用其他组合框进行搜索,请尝试对代码使用SwingBits库。

You can find the jar files Here . 您可以在此处找到jar文件。

After that, add this line of code to your source after displaying all data in your jTable: 之后,在jTable中显示所有数据后,将以下代码行添加到您的源代码中:

TableRowFilterSupport.forTable(jTable1).searchable(true).apply();

After that, you would be able to sort and filter data on runtime using left and right clicks of your mouse respectively. 之后,您将能够在运行时分别使用鼠标左键和右键单击对数据进行排序和过滤。

This is example with custom TableModel 这是自定义TableModel的示例

StudentTableModel.java StudentTableModel.java

public class StudentTableModel extends AbstractTableModel implements TableModel {
    private List<Student> data;
    private List<Student> filtredList;

    private Predicate<Student> predicate = student -> true;

    public List<Student> getData() {
        return data;
    }

    public void setData(List<Student> data) {
        this.data = data;
        filter(predicate);
    }

    public void filter(Predicate<Student> predicate) {
        this.predicate = predicate;

        filtredList = data.stream()
                .filter(predicate)
                .collect(Collectors.toList());

        fireTableDataChanged();
    }

    @Override
    public String getColumnName(int column) {
        return "Title " + (column + 1);
    }

    @Override
    public int getColumnCount() {
        return 4;
    }

    @Override
    public int getRowCount() {
        if(filtredList == null) {
            return 0;
        }

        return filtredList.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Student student = filtredList.get(rowIndex);
        switch (columnIndex) {
            case 0: return rowIndex + 1;
            case 1: return student.getName();
            case 2: return student.getClassName();
            case 3: return student.getSectionName();

            default: return "N/A";
        }
    }
}

MainFrame.java MainFrame.java

public class MainFrame extends JFrame {

    private JTextField textField;
    private JComboBox<String> classComboBox, sectionComboBox;
    private JTable table;

    public MainFrame(String title) {
        super(title);
        creageGUI();
    }

    private void creageGUI() {
        List<Student> list = new ArrayList<>();
        list.add(new Student("Name 1", "Class B", "1"));
        list.add(new Student("Name 2", "Class A", "1"));
        list.add(new Student("Name 3", "Class B", "3"));
        list.add(new Student("Name 4", "Class A", "1"));
        list.add(new Student("Name 5", "Class A", "2"));
        list.add(new Student("Name 6", "Class C", "1"));
        list.add(new Student("Name 7", "Class A", "3"));
        list.add(new Student("Name 8", "Class B", "4"));
        list.add(new Student("Name 9", "Class A", "1"));
        list.add(new Student("Name 10", "Class C", "2"));
        list.add(new Student("Name 11", "Class B", "1"));
        list.add(new Student("Name 12", "Class C", "1"));

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        setLayout(new BorderLayout(0, 5));
        setMinimumSize(new Dimension(600, 480));

        textField = new JTextField(20);
        textField.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                actionListener(null);
            }

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

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

        JPanel searchPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
        searchPanel.add(new JLabel("Search"));
        searchPanel.add(textField);

        classComboBox = new JComboBox<>(new String[]{"Class A", "Class B", "Class C"});
        classComboBox.setSelectedIndex(-1);
        classComboBox.addActionListener(this::actionListener);

        sectionComboBox = new JComboBox<>(new String[] {"1", "2", "3", "4", "5"});
        sectionComboBox.setSelectedIndex(-1);
        sectionComboBox.addActionListener(this::actionListener);

        JPanel comboBoxPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
        comboBoxPanel.add(new JLabel("Class"));
        comboBoxPanel.add(classComboBox);
        comboBoxPanel.add(Box.createHorizontalStrut(20));
        comboBoxPanel.add(new JLabel("Section"));
        comboBoxPanel.add(sectionComboBox);

        JPanel headerPanel = new JPanel();
        headerPanel.setLayout(new BoxLayout(headerPanel, BoxLayout.PAGE_AXIS));
        headerPanel.add(searchPanel);
        headerPanel.add(Box.createVerticalStrut(5));
        headerPanel.add(comboBoxPanel);

        StudentTableModel model = new StudentTableModel();
        model.setData(list);

        table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);

        JButton clearFilterButton = new JButton("Clear");
        clearFilterButton.addActionListener(event -> {
            textField.setText("");
            classComboBox.setSelectedIndex(-1);
            sectionComboBox.setSelectedIndex(-1);
        });

        JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        bottomPanel.add(clearFilterButton);

        add(headerPanel, BorderLayout.PAGE_START);
        add(scrollPane, BorderLayout.CENTER);
        add(bottomPanel, BorderLayout.PAGE_END);
    }

    private void actionListener(ActionEvent event) {
        StudentTableModel model = (StudentTableModel) table.getModel();
        model.filter(student -> {
            String name = textField.getText();
            String className = (String) classComboBox.getSelectedItem();
            String sectionName = (String) sectionComboBox.getSelectedItem();

            if(!name.isEmpty() && !student.getName().contains(name)) {
                return false;
            }

            if(className != null && !student.getClassName().equals(className)) {
                return false;
            }

            if(sectionName != null && !student.getSectionName().equals(sectionName)) {
                return false;
            }

            return true;
        });
    }
}

and Student.java Student.java

public class Student {
    private String name;
    private String className;
    private String sectionName;

    public Student() {
    }

    public Student(String name, String className, String sectionName) {
        this.name = name;
        this.className = className;
        this.sectionName = sectionName;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getSectionName() {
        return sectionName;
    }

    public void setSectionName(String sectionName) {
        this.sectionName = sectionName;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM