---
category: swing
folder: SelectionKeeper
title: TableSorterでソートしても選択状態を維持
tags: [JTable, JTableHeader, TableSorter]
author: aterai
pubdate: 2005-12-12T11:20:10+09:00
description: TableSorter.javaを使ってソートしても、行の選択状態を保存しておきます。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTS229Uo9I/AAAAAAAAAjc/ay3eckOCWco/s800/SelectionKeeper.png
---
* 概要 [#summary]
`TableSorter.java`を使ってソートしても、行の選択状態を保存しておきます。

#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTS229Uo9I/AAAAAAAAAjc/ay3eckOCWco/s800/SelectionKeeper.png)

* サンプルコード [#sourcecode]
#code(link){{
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();
  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);
    }
  }
}
// ...
}}

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

上記のサンプルでは、[https://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java TableSorter.java]中の`MouseHandler`を変更し、`0`列目の番号をキーにして行の選択状態を保存するようにしています。
- カラムは一意で重複しない値をもつ必要がある
- 上記のサンプルでは、[https://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java TableSorter.java]中の`MouseHandler`を変更し、`0`列目の番号をキーにして行の選択状態を保存
- `JDK 1.6.0`の`TableRowSorter`でソートを行う場合は、標準で選択状態が保存される
-- [[TableRowSorterでJTableのソート>Swing/TableRowSorter]]

`JDK 1.6.0`の`TableRowSorter`でソートを行う場合は、標準で選択状態が保存されるようです([[TableRowSorterでJTableのソート>Swing/TableRowSorter]])。

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java TableSorter.java]
- [[TableRowSorterでJTableのソート>Swing/TableRowSorter]]

* コメント [#comment]
#comment
#comment