0

当我从 ComboBox 中选择类和部分时,它必须在 Jtable 中搜索特定的类和部分并只显示那些类和部分?

在此处输入图像描述

4

2 回答 2

0

不要使用额外的组合框进行搜索,而是尝试将 SwingBits 库用于您的代码。

您可以在此处找到 jar 文件。

之后,在 jTable 中显示所有数据后,将这行代码添加到源代码中:

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

之后,您将能够分别使用鼠标左键和右键单击在运行时对数据进行排序和过滤。

于 2017-10-07T07:07:53.070 回答
0

这是自定义 TableModel 的示例

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

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

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;
    }
}
于 2017-10-07T14:33:07.063 回答