概要

JTableの空文字列を昇順・降順のどちらでソートしても常に末尾になるようなComparatorを設定します。

サンプルコード

class RowComparator implements Comparator<String> {
  protected final int column;
  private final JTable table;

  protected RowComparator(JTable table, int column) {
    this.table = table;
    this.column = column;
  }

  @Override public int compare(String a, String b) {
    int flag = 1;
    List<? extends RowSorter.SortKey> keys = table.getRowSorter().getSortKeys();
    if (!keys.isEmpty()) {
      RowSorter.SortKey sortKey = keys.get(0);
      if (sortKey.getColumn() == column && sortKey.getSortOrder() == SortOrder.DESCENDING) {
        flag = -1;
      }
    }
    if (a.isEmpty() && !b.isEmpty()) {
      return flag;
    } else if (!a.isEmpty() && b.isEmpty()) {
      return -1 * flag;
    } else {
      return a.compareTo(b);
    }
  }
}
View in GitHub: Java, Kotlin

解説

  • Comparator<String>#compare(...)をオーバーライドして、昇順の場合は「空文字列 < 文字列」、降順の場合は「空文字列 > 文字列」として常に空文字列以外が優先されるComparatorを作成
    • このComparatorTableRowSorter#setComparator(...)ですべての列に設定
    • JTableのソートではnullは内部でふるい落とされてしまうため、Comparator#nullsFirst(...)などは使用しても無意味
      • @Override public int compare(String a, String b)の引数abnullになることはない
    • 空文字列ではなくnullが設定されている場合、表示上は同一だが降順ソートするとnullが先頭にきてしまう

参考リンク

コメント