TITLE:TableSorterでJTableをソート
Posted by terai at 2005-02-28

TableSorterでJTableをソート

TableSorter.javaを利用して、JTableの行を降順、昇順、初期状態にソートします。以下のサンプルは、以前Tutorialにあった*1TableSorter.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)から、TableSorter.java*2を使用しています。
  • category: swing folder: TableSorter title: TableSorterでJTableをソート tags: [JTable, TableSorter] author: aterai pubdate: 2005-02-28T18:44:05+09:00 description: JDK 1.5.0以前に、The Java™ Tutorialに存在したTableSorter.javaを使用して、JTableの行を降順、昇順、初期状態にソートします。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTUp0MLx6I/AAAAAAAAAmY/omjw4LoJbbc/s800/TableSorter.png

概要

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

#screenshot

サンプルコード

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

解説

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

解説

The Java™ Tutorial版のTableSorterを使用して、JTableのソートで使用しているものと同じTableModelをソートしています。 The JavaTM Tutorial版のTableSorterには、Ctrlキーを押しながらヘッダをクリックすると、そのカラムを第二キーとしてソートする機能もあります。
  • TableSorterにはCtrlキーを押しながらヘッダをクリックすると、そのカラムを第2キー、第3キーとしてソートする機能もある
  • JDK 1.5.0Genericsの警告を出さないようにするにはTableSorter.javaに以下のような修正が必要
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);
    return ((Comparable) o1).compareTo(o2);
  }
}
#spanadd

#spanend
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;
#spandel
private Map<Class, Comparator> columnComparators = new HashMap<Class, Comparator>();
#spanend
#spandel
private List<Directive> sortingColumns = new ArrayList<Directive>();
#spanend
#spanadd
private Map<Class, Comparator> columnComparators = new HashMap<>();
#spanend
#spanadd
private List<Directive> sortingColumns = new ArrayList<>();
#spanend

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> {
  if (comparator != null) {
    return comparator;
  }
#spanadd
// ...
#spanend
#spanadd
private class Row implements Comparable<Row> {
#spanend
  private int modelIndex;
  public Row(int index) {
    this.modelIndex = index;
  }
  public int compareTo(Row o) {
    int row1 = modelIndex;
    int row2 = o.modelIndex;
#spandel
//......
#spanend
#spanadd
// ...
#spanend
Java SE 6 では、JTable標準で簡単にソート機能を追加することができます(SORTING AND FILTERING TABLESTableRowSorterでJTableのソート)。
  • -
  • LookAndFeelを動作中に切り替える場合は、sorter.setTableHeader(table.getTableHeader());で設定したJTableHeaderを新しいLookAndFeelを適用したものに入れ替えておかないとNullPointerExceptionが発生する

参考リンク

コメント

参考リンク

コメント