• title: TableSorterでJTableをソート tags: [JTable, TableSorter] author: aterai pubdate: 2005-02-28 description: JDK 1.5.0以前に、The Java™ TutorialにあったTableSorter.javaを使用して、JTableの行を降順、昇順、初期状態にソートします。

概要

JDK 1.5.0以前に、The Java™ TutorialにあったTableSorter.javaを使用して、JTableの行を降順、昇順、初期状態にソートします。

サンプルコード

//DefaultTableModel model = new DefaultTableModel();
TestModel model = new TestModel();
TableSorter sorter = new TableSorter(model);
JTable table = new JTable(sorter);
sorter.setTableHeader(table.getTableHeader());
View in GitHub: Java, Kotlin

解説

The Java™ Tutorial版のTableSorterを使用して、JTableのソートで使用しているものと同じTableModelでソートしています。

TableSorterには、Ctrlキーを押しながらヘッダをクリックすると、そのカラムを第二キーとしてソートする機能もあります。

JDK 1.4.xWindows XPの環境で、ヘッダにカーソルを置いてもロールオーバーしない場合があるようです。上記のスクリーンショットはJDK 1.5.0_01で撮っています。


JDK 1.5.0Genericsの警告を出さないようにするには、TableSorter.javaに、以下のような修正を加えれば良いようです。

private static class ComparableComparator implements Comparator {
  @SuppressWarnings("unchecked")
  public int compare(Object o1, Object o2) {
    return ((Comparable) o1).compareTo(o2);
  }
}
public static final ComparableComparator COMPARABLE_COMAPRATOR
    = new ComparableComparator();
public static final ComparableComparator LEXICAL_COMPARATOR
    = new ComparableComparator() {
  @SuppressWarnings("unchecked")
  public int compare(Object o1, Object o2) {
    return o1.toString().compareTo(o2.toString());
  }
};
private TableModelListener tableModelListener;
private Map<Class, Comparator> columnComparators = new HashMap<>();
private List<Directive> sortingColumns = new ArrayList<>();

protected ComparableComparator getComparator(int column) {
  Class columnType = tableModel.getColumnClass(column);
  ComparableComparator comparator
      = (ComparableComparator) columnComparators.get(columnType);
    if (comparator != null) {
      return comparator;
    }
 private class Row implements Comparable<Row> {
  private int modelIndex;
  public Row(int index) {
    this.modelIndex = index;
  }
  public int compareTo(Row o) {
    int row1 = modelIndex;
    int row2 = o.modelIndex;
//......

LookAndFeelを動作中に切り替える場合は、sorter.setTableHeader(table.getTableHeader());で設定したJTableHeaderを新しいLookAndFeelを適用したものに入れ替えておかないと、NullPointerExceptionが発生します。

private final TableSorter sorter = new TableSorter(model);
private final JTable table = new JTable(sorter) {
  @Override public void updateUI() {
    sorter.setTableHeader(null);
    super.updateUI();
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        JTableHeader h = table.getTableHeader();
        sorter.setTableHeader(h);
        h.repaint();
      }
    });
  }
};

参考リンク

コメント