Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Lọc (filter) JTable trong Java Swing

TableRowSorter & RowFilter

TableRowSorter<TableModel> cung cấp sắp xếp và lọc dòng. Dùng setRowFilter(RowFilter) để áp dụng bộ lọc. RowFilter.regexFilter(String regex) lọc theo regex trên tất cả cột (hoặc cột cụ thể).

Ví dụ: Filter table bằng TextField


import java.awt.*;
import java.awt.event.*;
import java.util.regex.PatternSyntaxException;
import javax.swing.*;
import javax.swing.table.*;

public class FilterTableDemo extends JFrame {
    private JTable table;
    private TableModel model;
    private TableRowSorter sorter;

    public FilterTableDemo() {
        setTitle("Filter JTable Demo");

        // Data
        Object[][] data = {
            {"Adithya", "Content Developer", 25000},
            {"Jai", "SME", 30000},
            {"Chaitanya", "Java Engineer", 45000},
            {"Ramesh", "Scala Developer", 40000},
            {"Ravi", "SAP Consultant", 70000}
        };
        String[] cols = {"Name", "Designation", "Salary"};

        model = new DefaultTableModel(data, cols) {
            @Override public Class getColumnClass(int c) {
                return getValueAt(0, c).getClass();
            }
        };

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

        // UI filter
        JPanel top = new JPanel(new BorderLayout());
        top.add(new JLabel("Filter: "), BorderLayout.WEST);
        JTextField filterField = new JTextField();
        top.add(filterField, BorderLayout.CENTER);
        JButton btnFilter = new JButton("Filter");
        top.add(btnFilter, BorderLayout.EAST);

        btnFilter.addActionListener(e -> {
            String text = filterField.getText();
            if (text.isEmpty()) {
                sorter.setRowFilter(null);
            } else {
                try {
                    sorter.setRowFilter(RowFilter.regexFilter("(?i)" + text)); // case-insensitive
                } catch (PatternSyntaxException ex) {
                    JOptionPane.showMessageDialog(this, "Regex lỗi: " + ex.getMessage());
                }
            }
        });

        add(new JScrollPane(table), BorderLayout.CENTER);
        add(top, BorderLayout.NORTH);
        add(btnFilter, BorderLayout.SOUTH); // actually btn already in top, adjust layout

        setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(FilterTableDemo::new);
    }
}

Kết quả

Gõ tên/phần tên vào ô Filter → bấm Filter → table chỉ hiển thị các dòng khớp.

Lọc (filter) JTable trong Java Swing Lọc (filter) JTable trong Java Swing

Mẹo: RowFilter.numberFilter, dateFilter, andFilter, orFilter, notFilter cho logic phức tạp.