Swing/SelectionKeeper のバックアップの現在との差分(No.11)
TITLE:TableSorterでソートしても選択状態を維持
TableSorterでソートしても選択状態を維持
編集者:Terai Atsuhiro~
作成日:2005-12-13
更新日:2021-02-25 (木) 10:46:26
概要
TableSorter.java
を使ってソートしても、行の選択状態を保存しておきます。
Screenshot
Advertisement
概要
TableSorter.javaを使ってソートしても、行の選択状態を保存しておきます。#screenshot
サンプルコード
#spanend
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);
}
}
}
......
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
private class MouseHandler extends MouseAdapter {
#spanend
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);
}
}
#spanadd
}
#spanend
#spanadd
Vector saveSelectedRow(JTable table, int keyCol) {
#spanend
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;
#spanadd
}
#spanend
#spanadd
void loadSelectedRow(JTable table, Vector list, int keyCol) {
#spanend
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);
}
}
#spanadd
}
#spanend
#spanadd
// ...
#spanend
- &jnlp;
- &jar;
- &zip;
解説
JTableHeaderがクリックされてソートが行われる前に、選択されている行のあるカラムの値を保存し、ソートが終わった後でその値をキーに選択し直しています。あるカラムは、一意で重複しない値をもつ必要があります。解説
JTableHeader
がクリックされてソートが行われる前に選択されている行のあるカラムの値を保存し、ソートが終わった後でその値をキーに選択し直しています。
上記のサンプルでは、TableSorter.java中のMouseHandlerを変更し、0列目の番号をキーにして行の選択状態を保存するようにしています。
- カラムは一意で重複しない値をもつ必要がある
- 上記のサンプルでは、TableSorter.java中の
MouseHandler
を変更し、0
列目の番号をキーにして行の選択状態を保存 -
JDK 1.6.0
のTableRowSorter
でソートを行う場合は標準で選択状態が保存される