TITLE:TableSorterでJTableをソート

TableSorterでJTableをソート

編集者:Terai Atsuhiro
作成日:2005-02-28
更新日:2021-09-24 (金) 14:49:24

概要

TableSorter.javaを利用して、JTableの行を降順、昇順、初期状態にソートします。

以下のサンプルは、The JavaTM TutorialのSorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)から、TableSorter.java*1を使用しています。

#screenshot

サンプルコード

 //DefaultTableModel model = new DefaultTableModel();
 TestModel model = new TestModel();
 TableSorter sorter = new TableSorter(model);
 JTable table = new JTable(sorter);
 sorter.setTableHeader(table.getTableHeader());
  • &jnlp;
  • &jar;
  • &zip;

解説

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

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

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

1.5でGenericsの警告を出さないようにするには、TableSorter.javaに、以下のような修正を加えれば良いようです。ただし、まだ@SuppressWarnings("unchecked")があったり、テストも不十分です。

 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<Class, Comparator>();
 private List<Directive> sortingColumns = new ArrayList<Directive>();

 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;

Java SE 6 では、JTable標準で簡単にソート機能を追加することができます(参考TableRowSorterでJTableのソート)。

参考リンク

コメント