« JOptionPaneでカーソルキーを反応させる | Main | Acrobat&AdobeReader »

2006.08.05

Tableの内容をソート

 Java6からRowSorterを用いることで、(Javaの標準コンポーネントの範囲内で)簡単にソート機能付きのテーブルを作成できるようになりました。実際にJTableと組み合わせるとなると、DefaultRowSorter(フィルタリング用のメソッド等が追加されている)かTableRowSorter(Modelとの組み合わせ)をベースに使用することになるかと思いますが。

 とりあえずの基本形は(JavaDocにも記載されていますが)こんな感じ(b86の場合)。

TableModel model = new HogeTableModel();
JTable table = new JTable(model);
RowSorter sorter = new TableRowSorter(model);
table.setRowSorter(sorter);

 複数列のソートを使用する場合は、DefaultRowSorterあるいはTableRowSorterを使用して、

TableRowSorter sorter = new TableRowSorter(model);
sorter.setMaxSortKeys(3);  //3つまでをキーとする場合
table.setRowSorter(sorter);

といった感じ。

 ただ、この場合、ヘッダー部分は最後に選択した列にしかマークが付かないため、第2のキーがどの列かっていうのがわかりにくいのが難点です(^^;
 ちなみに、並び順の初期状態をセットする場合は、

List s = new ArrayList();
s.add(new RowSorter.SortKey(0, SortOrder.DESCENDING));
sorter.setSortKeys(s);

ってやると、最初の列を降順で並べ替えた状態となります。

 余談ですが、RowSorterをセットした状態でテーブルの内容が0行になってしまった場合、ArrayIndexOutOfBoundsExceptionがスローされてしまうようです。ソースを見た感じ、bugのような気がするので、最新版では修正されているかもしれませんが・・・。
 とりあえずごまかす場合は、

sorter = new TableRowSorter(model) {
  @Override
  public int convertRowIndexToView(int index) {
    if (super.getModel().getRowCount() == 0) return 0;
    return super.convertRowIndexToView(index);
  }
  @Override
  public int convertRowIndexToModel(int index) {
    if (super.getModel().getRowCount() == 0) return 0;
    return super.convertRowIndexToModel(index);
  }
};

ってな感じで「見た目の行番号」「内部(model)の行番号」を変換する部分をオーバーライドしてあげると回避できるようです。

|

« JOptionPaneでカーソルキーを反応させる | Main | Acrobat&AdobeReader »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/11278251

Listed below are links to weblogs that reference Tableの内容をソート:

« JOptionPaneでカーソルキーを反応させる | Main | Acrobat&AdobeReader »