概要

JListのモデルに追加したアイテムの名前などを条件として昇順・降順ソートを実行します。

スクリーンショット

Swing/SortedListModel.png

サンプルコード

comparator = Comparator.comparing(ListItem::getTitle);
if (descending.isSelected()) {
  comparator = comparator.reversed();
}
List<ListItem> selected = list.getSelectedValuesList();
model.clear();
if (comparator == null) {
  Stream.of(defaultModel).forEach(model::addElement);
  directionList.forEach(r -> r.setEnabled(false));
} else {
  Stream.of(defaultModel).sorted(comparator).forEach(model::addElement);
  directionList.forEach(r -> r.setEnabled(true));
}
for (ListItem item : selected) {
  int i = model.indexOf(item);
  list.addSelectionInterval(i, i);
}
view all

解説

  • 水平ニュースペーパー・スタイルレイアウトを設定したJListで、アイテム(セル)のタイトル文字列やアイコンのカラーコードでソートを実行
    • JRadioButtonが選択されるとComparator<ListItem>を変更して元リストモデルのストリームからStream#sorted(comparator)を実行してソートされた新規リストモデルを作成している
    • JListデフォルトのセルを垂直方向に1列に並べたレイアウトで一種類のソートを行う場合は、ヘッダを非表示にしたJTableRowFilterで代用可能
  • Sort
    • None
      • アイテムの初期配列(ListItem[])からソートなしでリストモデルを復元
    • Name
      • Comparator.comparing(ListItem::getTitle)でソートしたリストモデルをJListに設定
    • Color
      • Comparator.comparing(item -> item.getColor().getRGB())でソートしたリストモデルをJListに設定
  • Direction
    • ascending
      • 昇順になるComparatorを使用
    • descending
      • 降順になるようComparator#.reversed()を使用してComparatorを変更

参考リンク

コメント