JTable은 Java Swing에서 표 형태의 데이터를 유연하게 생성하고 화면에 표시할 수 있게 해주는 강력한 컴포넌트입니다. TableModel 인터페이스는 테이블의 내용을 정의하는 객체들이 구현해야 하는 메서드들을 규정하며, 일반적으로 AbstractTableModel 클래스를 상속받아 사용자 정의 테이블 모델을 만듭니다. 또한 JTable은 setCellEditor() 메서드를 통해 셀 편집 기능을 제공하며, 이 메서드는 TableCellEditor 인터페이스의 객체를 인자로 받습니다.
JTable 필터링의 핵심: TableRowSorter
테이블 데이터를 조건에 따라 걸러 보여주고 싶다면 TableRowSorter 클래스의 setRowFilter() 메서드를 사용하면 됩니다. 이 방식은 원본 데이터(모델)는 그대로 유지하면서, 뷰 단계에서 특정 조건에 맞는 행만 화면에 표시해 주기 때문에 매우 효율적입니다.
필터링 로직은 크게 다음과 같이 동작합니다.
- 검색어가 비어 있으면
setRowFilter(null)을 호출하여 전체 행을 다시 표시합니다. - 검색어가 있으면
RowFilter.regexFilter(text)를 통해 정규식 기반 필터를 적용합니다. - 잘못된 정규식 패턴이 입력되면
PatternSyntaxException을 처리하여 오류를 안전하게 넘깁니다.
예제 코드
아래 예제는 이름, 직책, 급여 정보를 담은 직원 테이블을 만들고, 상단의 텍스트 필드에 입력한 값으로 실시간 필터링을 수행하는 완전한 프로그램입니다.
import java.awt.*;
import java.awt.event.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.table.*;
public class FilterTableTest extends JFrame {
private JTable table;
private TableModel model;
public FilterTableTest() {
setTitle("FilterTable Test");
Object rows[][] = {
{"Adithya", "Content Developer", 25000},
{"Jai", "SME", 30000},
{"Chaitanya", "Java Engineer", 45000},
{"Ramesh", "Scala Developer", 40000},
{"Ravi", "SAP Consultant", 70000}
};
Object columns[] = {"Name", "Designation", "Salary"};
model = new DefaultTableModel(rows, columns) {
public Class getColumnClass(int column) {
Class returnValue;
if ((column >= 0) && (column < getColumnCount())) {
returnValue = getValueAt(0, column).getClass();
} else {
returnValue = Object.class;
}
return returnValue;
}
};
table = new JTable(model);
final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
add(new JScrollPane(table), BorderLayout.CENTER);
JPanel panel = new JPanel(new BorderLayout());
JLabel label = new JLabel("Filter");
panel.add(label, BorderLayout.WEST);
final JTextField filterText = new JTextField("");
panel.add(filterText, BorderLayout.CENTER);
add(panel, BorderLayout.NORTH);
JButton button = new JButton("Filter");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String text = filterText.getText();
if (text.length() == 0) {
sorter.setRowFilter(null); // 필터 해제 → 전체 행 표시
} else {
try {
sorter.setRowFilter(RowFilter.regexFilter(text)); // 정규식 필터 적용
} catch (PatternSyntaxException pse) {
System.out.println("Bad regex pattern");
}
}
}
});
add(button, BorderLayout.SOUTH);
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String args[]) {
new FilterTableTest();
}
}
코드 핵심 포인트 정리
- getColumnClass() 재정의: 각 열의 실제 데이터 타입(String, Integer 등)을 반환하도록 재정의하면 숫자 열이 올바르게 정렬·필터링됩니다.
- TableRowSorter 생성 및 연결:
new TableRowSorter<TableModel>(model)로 생성한 뒤table.setRowSorter(sorter)로 테이블에 연결합니다. - RowFilter.regexFilter(): 입력 문자열을 정규식으로 해석하여 해당 패턴과 일치하는 행만 남깁니다. 예를 들어 "Java"를 입력하면 직책에 "Java Engineer"가 포함된 행만 표시됩니다.
- 예외 처리: 사용자가 유효하지 않은 정규식(예: "[")을 입력했을 때 프로그램이 비정상 종료되지 않도록
PatternSyntaxException을 try-catch로 처리합니다.
실행 결과
프로그램을 실행하면 아래와 같이 전체 직원 목록이 테이블에 표시됩니다.

검색창에 특정 키워드를 입력하고 Filter 버튼을 누르면, 해당 조건과 일치하는 행만 걸러져 나타납니다.

마무리
이처럼 TableRowSorter와 RowFilter를 활용하면 복잡한 검색 로직 없이도 몇 줄의 코드로 JTable에 강력한 필터링 기능을 추가할 수 있습니다. 정규식을 응용하면 부분 일치, 대소문자 무시((?i) 플래그), 여러 조건 결합 등 더욱 정교한 검색 기능도 손쉽게 구현할 수 있습니다.