JTable이란 무엇인가?
JTable은 Java Swing에서 복잡한 데이터 구조를 표시하기 위해 사용되는 JComponent의 하위 클래스입니다. JTable 컴포넌트는 모델-뷰-컨트롤러(MVC) 디자인 패턴을 따르며, 데이터를 행(Row)과 열(Column) 형태로 화면에 출력합니다.
또한 JTable은 다음과 같은 다양한 리스너 인터페이스를 통해 유연한 이벤트 처리를 지원합니다.
- TableModelListener — 테이블 데이터의 변경 사항 감지
- TableColumnModelListener — 열 모델의 변경 사항 감지
- ListSelectionListener — 행 또는 열 선택 이벤트 처리
- CellEditorListener — 셀 편집 이벤트 처리
- RowSorterListener — 정렬 상태 변경 감지
JTable 검색 기능의 동작 원리
JTable에 검색 기능을 추가하려면 JTextField에 사용자가 입력한 문자열을 받아 테이블 전체에서 해당 값을 찾는 방식으로 구현합니다. 입력된 문자열과 일치하는 항목만 테이블에 표시되며, 나머지 행은 자동으로 숨겨집니다.
이 기능은 JTextField의 DocumentListener 인터페이스와 TableRowSorter, RowFilter 클래스를 조합하여 손쉽게 구현할 수 있습니다. 전체적인 동작 흐름은 다음과 같습니다.
- 사용자가 JTextField에 검색어를 입력합니다.
- DocumentListener가
insertUpdate,removeUpdate,changedUpdate이벤트를 통해 입력 변화를 실시간으로 감지합니다. search()메서드가 호출되어RowFilter.regexFilter()로 정규식 기반 필터를 적용합니다.- 일치하는 행만 JTable에 표시되고, 검색어가 비어 있으면
setRowFilter(null)을 호출하여 전체 행을 다시 보여줍니다.
전체 예제 코드
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
public class JTableSearchTest extends JFrame {
private JTextField jtf;
private JLabel searchLbl;
private TableModel model;
private JTable table;
private TableRowSorter sorter;
private JScrollPane jsp;
public JTableSearchTest() {
setTitle("JTableSearch Test");
jtf = new JTextField(15);
searchLbl = new JLabel("Search");
String[] columnNames = {"Name", "Technology"};
Object[][] rowData = {{"Raja", "Java"},{"Vineet", "Java Script"},{"Archana", "Python"},{"Krishna", "Scala"},{"Adithya", "AWS"},{"Jai", ".Net"}};
model = new DefaultTableModel(rowData, columnNames);
sorter = new TableRowSorter<>(model);
table = new JTable(model);
table.setRowSorter(sorter);
setLayout(new FlowLayout(FlowLayout.CENTER));
jsp = new JScrollPane(table);
add(searchLbl);
add(jtf);
add(jsp);
jtf.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
search(jtf.getText());
}
@Override
public void removeUpdate(DocumentEvent e) {
search(jtf.getText());
}
@Override
public void changedUpdate(DocumentEvent e) {
search(jtf.getText());
}
public void search(String str) {
if (str.length() == 0) {
sorter.setRowFilter(null);
} else {
sorter.setRowFilter(RowFilter.regexFilter(str));
}
}
});
setSize(475, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
setVisible(true);
}
public static void main(String[] args) {
new JTableSearchTest();
}
}코드 핵심 요약
- DefaultTableModel: 이름(Name)과 기술(Technology) 두 개의 열을 가진 샘플 데이터를 생성합니다.
- TableRowSorter: JTable에 정렬 및 필터링 기능을 부여하는 핵심 클래스입니다.
- DocumentListener: 검색창(JTextField)의 텍스트 변화를 실시간으로 감지하여 검색 메서드를 호출합니다.
- RowFilter.regexFilter(str): 입력된 문자열을 정규식 패턴으로 변환해 일치하는 행만 걸러냅니다.
- setRowFilter(null): 검색어가 없을 때 필터를 해제하여 전체 데이터를 표시합니다.
실행 결과
프로그램을 실행하면 아래와 같이 이름과 기술 정보가 담긴 테이블과 함께 'Search' 라벨과 검색 입력창이 화면에 나타납니다.

검색창에 특정 문자열(예: 'Java')을 입력하면 해당 단어가 포함된 행만 필터링되어 즉시 표시됩니다.

마무리
이처럼 DocumentListener와 RowFilter를 활용하면 별도의 검색 버튼 없이도 입력하는 순간 결과가 갱신되는 실시간 검색 기능을 JTable에 간단히 구현할 수 있습니다. 대소문자 무시 검색이나 여러 열 대상 검색 등으로 확장하고 싶다면 regexFilter(Pattern.compile(str, Pattern.CASE_INSENSITIVE).pattern()) 또는 rowFilter를 직접 오버라이드하는 방식을 활용해 보세요.