• title: TableSorterでソートしても選択状態を維持 tags: [JTable, JTableHeader, TableSorter] author: aterai pubdate: 2005-12-12 description: TableSorter.javaを使ってソートしても、行の選択状態を保存しておきます。

概要

TableSorter.javaを使ってソートしても、行の選択状態を保存しておきます。

サンプルコード

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);
    }
  }
}
//......
View in GitHub: Java, Kotlin

解説

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

上記のサンプルでは、TableSorter.java中のMouseHandlerを変更し、0列目の番号をキーにして行の選択状態を保存するようにしています。

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

コメント