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.

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