JavaでJTableに検索機能を実装する方法をわかりやすく解説
JTableは、複雑なデータ構造を表形式で表示するためのSwingコンポーネントで、JComponentのサブクラスです。JTableはMVC(Model View Controller)デザインパターンに従って設計されており、データを行と列の形式で画面に表示できます。また、TableModelListener、TableColumnModelListener、ListSelectionListener、CellEditorListener、RowSorterListenerといった各種リスナーインターフェースを利用することで、柔軟なイベント処理が可能です。
JTableに検索機能を実装するには、JTextFieldに入力された文字列をもとにテーブル内を絞り込む方法が一般的です。入力された文字列がテーブルのセルと一致した場合、該当する行だけを表示できます。この機能を実現するには、JTextFieldのDocumentListenerインターフェースを使い、テキストの変更をリアルタイムに検知してフィルタリング処理を呼び出すのがポイントです。
実装のポイント
- TableRowSorter:JTableに行の並べ替え・フィルタリング機能を提供するクラスです。
- RowFilter.regexFilter():正規表現に一致する行だけを抽出するフィルターを作成します。
- DocumentListener:JTextFieldへの文字入力・削除を即座に検知し、search()メソッドを実行します。
サンプルコード
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」の2列からなるテーブルデータを作成しています。次にTableRowSorterを生成してJTableにセットし、検索用のフィルタリングを有効化しています。
JTextFieldにはDocumentListenerを登録しており、文字の挿入(insertUpdate)、削除(removeUpdate)、属性変更(changedUpdate)のいずれが発生してもsearch()メソッドが呼び出されます。search()メソッド内部では、入力文字列が空の場合はsetRowFilter(null)を呼び出して全行を表示し、文字列がある場合はRowFilter.regexFilter(str)を設定して一致する行のみを表示します。
実行結果
プログラムを実行すると、以下のように名前や技術スタックの一覧が表示されたテーブルと検索ボックスが現れます。

検索ボックスに文字を入力すると、その文字列を含む行だけがリアルタイムに絞り込まれて表示されます。

このように、TableRowSorterとRowFilterを組み合わせることで、数行のコードを追加するだけでJTableに高機能な検索機能を実装できます。大文字・小文字を区別しない検索にしたい場合は、regexFilterの第3引数にMatcher.CASE_INSENSITIVEを指定するとよいでしょう。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー