• 追加された行はこの色です。
  • 削除された行はこの色です。
#navi(../)
*TableSorterでソートしても選択状態を維持 [#b783fd09]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-12-13~
更新日:&lastmod;

#contents

**概要 [#xc80a56f]
TableSorter.javaを使ってソートしても、行の選択状態を保存しておきます。

http://terai.xrea.jp/swing/selectionkeeper/screenshot.png

**サンプルコード [#h40eb221]
 private class MouseHandler extends MouseAdapter {
   public void mouseClicked(MouseEvent e) {
     JTableHeader h = (JTableHeader) e.getSource();
 (中略)
     if (column != -1) {
       int keyCol = 0;
       Vector list = saveSelectedRow(h.getTable(), keyCol);
       int status = getSortingStatus(column);
 (中略)
       setSortingStatus(column, status);
       loadSelectedRow(h.getTable(), list, keyCol);
     }
   }
 }
 Vector saveSelectedRow(JTable table, int keyCol) {
   Vector list = new Vector();
   int[] ilist = table.getSelectedRows();
   if(ilist==null || ilist.length<=0) return;
   TestModel model = (TestModel)tableModel;
   for(int i=ilist.length-1;i>=0;i--) {
     list.add(model.getValueAt(modelIndex(ilist[i]), keyCol));
   }
   return list;
 }
 void loadSelectedRow(JTable table, Vector list, int keyCol) {
   if(list==null || list.size()<=0) return;
   for(int i=0;i<tableModel.getRowCount();i++) {
     if(list.contains(tableModel.getValueAt(modelIndex(i), keyCol))) {
       table.getSelectionModel().addSelectionInterval(i, i);
     }
   }
 }
 (以下省略)

-[[サンプルを起動>http://terai.xrea.jp/swing/selectionkeeper/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/selectionkeeper/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/selectionkeeper/src.zip]]

**解説 [#o32bc144]
JTableHeaderがクリックされてソートが行われる前に、選択されている行のあるカラムの値を保存し、ソートが終わった後でその値をキーに選択し直しています。あるカラムは、一意で重複しない値をもつ必要があります。

上記のサンプルでは、[[TableSorter.java>http://java.sun.com/docs/books/tutorial/uiswing/components/example-1dot4/TableSorter.java]]中のMouseHandlerを変更し、0列目の番号をキーにして行の選択状態を保存するようにしています。

//**参考リンク
**コメント [#o1c336f5]
#comment