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

クラスTableRowSorter<M extends TableModel>

java.lang.Object
javax.swing.RowSorter<M>
javax.swing.DefaultRowSorter<M,Integer>
javax.swing.table.TableRowSorter<M>
型パラメータ:
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
関連項目: