JTableのTableColumnの表示順を初期状態に戻す
Total: 3491
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JTable
のTableColumn
の表示順が入れ替えられていた場合、それを初期状態(モデル順)に戻します。
Screenshot
Advertisement
サンプルコード
TableColumnModel m = table.getColumnModel();
if (m instanceof SortableTableColumnModel) {
((SortableTableColumnModel) m).restoreColumnOrder();
}
// ...
class SortableTableColumnModel extends DefaultTableColumnModel {
public void restoreColumnOrder() {
Collections.sort(
tableColumns,
Comparator.comparingInt(TableColumn::getModelIndex));
fireColumnMoved(new TableColumnModelEvent(this, 0, tableColumns.size()));
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DefaultTableColumnModel
のprotected Vector<TableColumn> tableColumns
をTableColumn
のモデル・インデックス(TableColumn#getModelIndex()
メソッドで取得可能)で直接ソートすることで入れ替え前の初期状態を復元しています。
tableColumns
メソッドはprotected
なので、ソートはDefaultTableColumnModel
を継承するクラス内で実行するJTable#createDefaultColumnModel()
をオーバーライドしてこのTableColumnModel
を使用する- ソート後
fireColumnMoved(...)
でTableColumn
の移動を通知し、再描画を実行する必要がある
- 直接
tableColumns
をソートするのではなく、以下のようにTableColumnModel#moveColumn(int, int)メソッドなどを使用してソートする方法もある
public static void sortTableColumn(TableColumnModel model) {
// selection sort
int n = model.getColumnCount();
for (int i = 0; i < n - 1; i++) {
TableColumn c = (TableColumn) model.getColumn(i);
for (int j = i + 1; j < n; j++) {
TableColumn p = (TableColumn) model.getColumn(j);
if (c.getModelIndex() - p.getModelIndex() > 0) {
model.moveColumn(j, i);
i -= 1;
break;
}
}
}
}
参考リンク
- TableColumnModelEvent (Java Platform SE 8)
- TableColumnModel#moveColumn(int, int) (Java Platform SE 8)