• category: swing folder: SortedListModel title: JListのモデルをソートする tags: [JList, ListModel] author: aterai pubdate: 2020-06-08T16:59:00+09:00 description: JListのモデルに追加したアイテムの名前などを条件として昇順・降順ソートを実行します。 image: https://drive.google.com/uc?id=1mT1M-6FPOizXbOEh4iADApE765Hu2jf2

概要

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

サンプルコード

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 in GitHub: Java, Kotlin

解説

  • 水平ニュースペーパー・スタイルレイアウトを設定した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を変更

参考リンク

コメント