Swing/SelectionKeeper の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/SelectionKeeper へ行く。
- Swing/SelectionKeeper の差分を削除
--- 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`がクリックされてソートが行われる前に選択されている行のあるカラムの値を保存し、ソートが終わった後でその値をキーに選択し直しています。 - カラムは一意で重複しない値をもつ必要がある - 上記のサンプルでは、[https://docs.oracle.com/javase/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java TableSorter.java]中の`MouseHandler`を変更し、`0`列目の番号をキーにして行の選択状態を保存 - `JDK 1.6.0`の`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