モジュール java.desktop
パッケージ javax.swing.table

クラスTableRowSorter<M extends TableModel>

  • 型パラメータ:
    M - モデルの型。TableModelの実装である必要がある

    public class TableRowSorter<M extends TableModel>
    extends DefaultRowSorter<M,Integer>
    TableModelを使ってソートおよびフィルタ機能を提供するRowSorterの実装です。 次に示すのは、JTableにソート機能を追加する例です。
       TableModel myModel = createMyTableModel();
       JTable table = new JTable(myModel);
       table.setRowSorter(new TableRowSorter(myModel));
     
    このコードは、ユーザーが適切なジェスチャ(列ヘッダーのクリックなど)を実行したときテーブルが視覚的にソートされるように、接続処理を行います。

    JTableの行ベースのメソッドとJTableの選択モデルは、ビューを参照しますが、配下のモデルは参照しません。 したがって、2つの間で変換を行う必要があります。 たとえば、myModelの選択を行う場合は、次のようにインデックスを変換する必要があります。

       int[] selection = table.getSelectedRows();
       for (int i = 0; i < selection.length; i++) {
         selection[i] = table.convertRowIndexToModel(selection[i]);
       }
     
    座標に基づいたJTable内の行を選択するときと同様に、配下のモデルから反対の処理を行います。
       table.setRowSelectionInterval(table.convertRowIndexToView(row),
                                     table.convertRowIndexToView(row));
     

    前の例は、フィルタ機能が有効になっていない場合の例です。 フィルタ機能が有効になっている場合、convertRowIndexToViewは、ビューに表示されない場所に対して -1を返します。

    TableRowSorterは、比較の際、Comparatorを使用します。 列に対してComparatorを選択する方法は、次のように定義します。

    1. 列のComparatorsetComparatorメソッドを使って指定されている場合は、このメソッドを使用します。
    2. getColumnClassから返される列クラスがStringの場合は、Collator.getInstance()から返されるComparatorを使用します。
    3. 列クラスがComparableを実装する場合は、compareToメソッドを呼び出すComparatorを使用します。
    4. TableStringConverterが指定されている場合は、これを使って値をStringに変換し、Collator.getInstance()から返されるComparatorを使用します。
    5. それ以外の場合は、オブジェクト上でtoStringを呼び出した結果に対して、Collator.getInstance()から返されるComparatorを使用します。

    TableRowSorterは、ソート機能のほかにフィルタ機能も提供します。 フィルタの指定には、setFilterメソッドを使用します。 次に示すのは、文字列「foo」を含む行だけを表示する例です。

       TableModel myModel = createMyTableModel();
       TableRowSorter sorter = new TableRowSorter(myModel);
       sorter.setRowFilter(RowFilter.regexFilter(".*foo.*"));
       JTable table = new JTable(myModel);
       table.setRowSorter(sorter);
     

    配下のモデルの構造が変化した場合(modelStructureChangedメソッドが呼び出された場合)、列のComparator、現在のソート順序、および各列がソート可能であるかどうかの設定がリセットされ、デフォルト値に戻ります。 デフォルトではソートは行われず(モデルと同様)、列はソート可能です。

    TableRowSorterには、仮型パラメータ(モデルの型)が1つあります。 モデルに正確に対応する型を渡すことにより、キャストなしでモデルに基づいてフィルタを適用することができます。 この例についてはRowFilterの説明を参照してください。

    警告: DefaultTableModelObjectの列クラスを返します。 そのため、すべての比較はtoStringを使って行われます。 これは負荷が大きい可能性があります。 列に1つの型(Integerなど)しか含まれない場合は、getColumnClassをオーバーライドして適切なClassを返すようにします。 これにより、このクラスのパフォーマンスが飛躍的に向上します。

    導入されたバージョン:
    1.6
    関連項目:
    JTable, RowFilter, DefaultTableModel, Collator, Comparator
    • コンストラクタの詳細

      • TableRowSorter

        public TableRowSorter()
        空のモデルでTableRowSorterを作成します。
      • TableRowSorter

        public TableRowSorter​(M model)
        modelを配下のTableModelとして使用するTableRowSorterを作成します。
        パラメータ:
        model - 使用する配下のTableModelnull値は空のモデルとして扱われる
    • メソッドの詳細

      • setModel

        public void setModel​(M model)
        このTableRowSorterの配下のモデルとして使用するTableModelを設定します。 null値を指定すると、空のモデルを設定できます。
        パラメータ:
        model使用する配下のモデル、またはnull
      • setStringConverter

        public void setStringConverter​(TableStringConverter stringConverter)
        値をモデルから文字列に変換するために使用するオブジェクトを設定します。 null以外の値を指定した場合、登録済みのComparatorを持たないオブジェクト値を文字列に変換できます。
        パラメータ:
        stringConverter - 値をモデルから文字列に変換するために使用するオブジェクト
      • getStringConverter

        public TableStringConverter getStringConverter()
        値をモデルから文字列に変換するために使用するオブジェクトを返します。
        戻り値:
        値をモデルから文字列に変換するために使用するオブジェクト
      • getComparator

        public Comparator<?> getComparator​(int column)
        指定された列のComparatorを返します。 setComparatorメソッドを使ってComparatorを指定していない場合、指定した列の列クラス(TableModel.getColumnClass)に基づいてComparatorが返されます。 列クラスがStringの場合、Collator.getInstanceが返されます。 列クラスがComparableを実装する場合は、compareToメソッドを呼び出すprivateのComparatorが返されます。 それ以外の場合はCollator.getInstanceが返されます。
        オーバーライド:
        getComparator、クラス: DefaultRowSorter<M extends TableModel,Integer>
        パラメータ:
        column - 配下のモデルに基づいて、Comparatorをフェッチする列
        戻り値:
        指定された列のComparator
        例外:
        IndexOutOfBoundsException - columnが配下のモデルの範囲外である場合
      • useToString

        protected boolean useToString​(int column)
        ソート時に比較を行う前に、値を文字列に変換するかどうかを返します。 trueの場合はModelWrapper.getStringValueAtを使用し、そうでない場合はModelWrapper.getValueAtを使用します。 ModelWrapper実装内でこの値を受け取る、TableRowSorterなどのサブクラスに一致します。
        オーバーライド:
        useToString、クラス: DefaultRowSorter<M extends TableModel,Integer>
        パラメータ:
        column - 配下のモデルに基づいて、テストする列のインデックス
        戻り値:
        ソート時に比較を行う前に値を文字列に変換する場合はtrue
        例外:
        IndexOutOfBoundsException - columnが有効でない場合