• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:TableSorterでJTableをソート
#navi(../)
RIGHT:Posted by [[terai]] at 2005-02-28
*TableSorterでJTableをソート [#j367981a]
TableSorter.javaを利用して、JTableの行を降順、昇順、初期状態にソートします。以下のサンプルは、以前Tutorialにあった((現在は、JDK 6 で導入された、TableRowSorter を使用するサンプルに更新されています。))、''TableSorter.java''を使用しています。%%The JavaTM Tutorialの[[Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting]]から、''TableSorter.java''((いつの間にか更新されていて、使いやすくなっています))を使用しています。%% 

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#nba2e358]
#code{{
//DefaultTableModel model = new DefaultTableModel();
TestModel model = new TestModel();
TableSorter sorter = new TableSorter(model);
JTable table = new JTable(sorter);
sorter.setTableHeader(table.getTableHeader());
}}

**解説 [#h8a583cb]
The JavaTM Tutorial版のTableSorterを使用して、[[JTableのソート>Swing/SortableTable]]で使用しているものと同じ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")があったり、テストも不十分です。
#code{{
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標準で簡単にソート機能を追加することができます([[参考>http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#2]]、[[TableRowSorterでJTableのソート>Swing/TableRowSorter]])。
Java SE 6 では、JTable標準で簡単にソート機能を追加することができます([[SORTING AND FILTERING TABLES>http://java.sun.com/developer/JDCTechTips/2005/tt1115.html#2]]、[[TableRowSorterでJTableのソート>Swing/TableRowSorter]])。

**参考リンク [#f1d425ba]
-[[Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#sorting]]
-[[How to Use Tables>http://java.sun.com/docs/books/tutorial/uiswing/components/table.html]]
-[[Generics - Simple method but hard with generics: compareTo()>http://forums.sun.com/thread.jspa?threadID=598815]]
-[[TableSorter.java>http://java.sun.com/docs/books/tutorial/uiswing/examples/components/TableSorterDemoProject/src/components/TableSorter.java]]

**コメント [#n7689273]
#comment