Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaでJTableをフィルタリングする方法!TableRowSorterとsetRowFilter()の使い方を解説

JTableは、テーブルを柔軟に作成・表示できるSwingのコンポーネントです。テーブルの内容を扱うためのメソッドはTableModelインターフェースで定義されており、実際にはAbstractTableModelクラスを継承して独自のテーブルモデルを実装するのが一般的です。また、JTableではsetCellEditor()メソッドにTableCellEditorインターフェースの実装オブジェクトを渡すことで、セルの編集機能を追加することもできます。

テーブルの表示内容をフィルタリング(絞り込み)するには、TableRowSorterクラスのsetRowFilter()メソッドを使用します。

サンプルコード

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();
   }
}

コードのポイント

  • DefaultTableModelに行データと列名を渡してテーブルモデルを作成しています。
  • getColumnClass()をオーバーライドすることで、数値列(給与)が文字列ではなく数値として正しく認識され、ソートやフィルタが意図どおりに動作します。
  • TableRowSorterを生成し、setRowSorter()でJTableに設定することで、並べ替えとフィルタリングの両方が有効になります。
  • テキストフィールドに入力された文字列を正規表現としてRowFilter.regexFilter()に渡し、setRowFilter()でテーブルに適用します。
  • 入力が空の場合はsetRowFilter(null)を呼び出してフィルタを解除し、すべての行を再表示します。
  • 不正な正規表現が入力された場合にはPatternSyntaxExceptionをキャッチし、エラーメッセージを出力してアプリケーションの異常終了を防ぎます。

実行結果

プログラムを起動すると、「Name(氏名)」「Designation(役職)」「Salary(給与)」の3列からなるテーブルが表示されます。

JavaでJTableをフィルタリングする方法!TableRowSorterとsetRowFilter()の使い方を解説

テキストフィールドに「Java」などのキーワードを入力して「Filter」ボタンを押すと、条件に一致する行だけが表示されます。テキストを空にして再度ボタンを押せば、フィルタが解除されて全行が復元されます。

JavaでJTableをフィルタリングする方法!TableRowSorterとsetRowFilter()の使い方を解説

  1. Javaで編集可能なJLabelを実装する方法

    JLabelとはJLabelクラスはJComponentクラスを継承しており、JLabelのオブジェクトを使用することで、GUI上にテキストによる説明や情報を表示できます。JLabelの主な特徴は以下のとおりです。1行の読み取り専用テキスト、画像、またはその両方を表示できる重要なメソッドとして、setText()、setIcon()、setBackground()、setOpaque()、setHorizontalAlignment()、setVerticalAlignment()などが用意されているPropertyChangeListenerインターフェースを明示的に登録して、プロパティの変

  2. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー