JTableでファイルとディレクトリを別々にソート
Total: 7894, Today: 1, Yesterday: 0
Posted by aterai at
Last-modified:
Summary
JTableでファイルとディレクトリをグループ化して別々にソートし、ディレクトリグループが常に先頭になるように設定します。
Screenshot

Advertisement
Source Code Examples
// > dir /O:GN
// > ls --group-directories-first
finalComp = (a, b) -> {
int dir = getSortOrderDirection(table, i);
int v = Boolean.compare(b.isDirectory(), a.isDirectory());
return v == 0 ? baseComp.compare(a, b) : v * dir;
};
private static int getSortOrderDirection(JTable table, int column) {
return table.getRowSorter().getSortKeys().stream()
.findFirst()
.filter(k -> k.getColumn() == column
&& k.getSortOrder() == SortOrder.DESCENDING)
.map(k -> -1)
.orElse(1);
}
View in GitHub: Java, KotlinDescription
上記のサンプルでは、JTableにドラッグ&ドロップで追加したファイルやディレクトリを以下の3種類のComparatorでソートが可能です。
0列目のDefaultFile#getName()で取得したファイル名Stringで比較Comparator.comparing(File::getName, String.CASE_INSENSITIVE_ORDER);
Directory < File- ファイル名より先に「ディレクトリ < ファイル」で比較する
Comparatorを設定 Comparator.comparing(File::isDirectory, Comparator.reverseOrder()).thenComparing(baseComp);
- ファイル名より先に「ディレクトリ < ファイル」で比較する
Group Sorting- 昇順の場合は「ディレクトリ < ファイル」、降順の場合は「ディレクトリ > ファイル」として常にディレクトリが優先される
Comparatorを設定 - ディレクトリ同士、ファイル同士の場合はファイル名で比較する
- ディレクトリ優先の比較結果に対して、現在のソート方向を掛け合わせることで昇順時はディレクトリが上、降順時はディレクトリが下になるように制御
lsコマンドの--group-directories-firstオプションを付けた状態と同じソート
- 昇順の場合は「ディレクトリ < ファイル」、降順の場合は「ディレクトリ > ファイル」として常にディレクトリが優先される