概要

JTableのカラムヘッダをクリックすることで、行表示を降順、昇順にソートします。以下のサンプルは、SortableTableExampleを参考にして作成しています。

サンプルコード

class SortableTableModel extends DefaultTableModel {
  public SortableTableModel(String[] str, int row) {
    super(str, row);
  }
  public void sortByColumn(int column, boolean isAscent) {
    Collections.sort(getDataVector(), new ColumnComparator(column, isAscent));
    fireTableDataChanged();
  }
}
class ColumnComparator implements Comparator {
  final protected int index;
  final protected boolean ascending;
  public ColumnComparator(int index, boolean ascending) {
    this.index = index;
    this.ascending = ascending;
  }
  public int compare(Object one, Object two) {
    if (one instanceof Vector && two instanceof Vector) {
      Object oOne = ((Vector) one).elementAt(index);
      Object oTwo = ((Vector) two).elementAt(index);
      if (oOne == null && oTwo == null) {
        return 0;
      } else if (oOne == null) {
        return ascending ? -1 :  1;
      } else if (oTwo == null) {
        return ascending ?  1 : -1;
      } else if (oOne instanceof Comparable && oTwo instanceof Comparable) {
        Comparable cOne = (Comparable) oOne;
        Comparable cTwo = (Comparable) oTwo;
        return ascending ? cOne.compareTo(cTwo) : cTwo.compareTo(cOne);
      }
    }
    return 1;
  }
  public int compare(Number o1, Number o2) {
    double n1 = o1.doubleValue();
    double n2 = o2.doubleValue();
    if (n1 < n2) {
      return -1;
    } else if (n1 > n2) {
      return 1;
    } else {
      return 0;
    }
  }
}
view all

解説

上記のサンプルでは、カラムヘッダをクリックすることでソートできます。右クリックからポップアップメニューで、行を追加、削除したり、セルをダブルクリックして中身を色々編集するなどしてソートを試してみてください。

参考リンク

コメント

  • 非常に参考になりました。すぐに実装に使わせていただきます。 -- akio
  • カラムをドラッグして移動したとき、矢印が残ってしまうようです。 元からだったかデグレードしたのかちょっと不明です。 元からのようです。 -- aterai
  • 修正できたかな? 確認中。 確認済み。 -- aterai
  • Swing初心者の為このサイトのソースを参考に勉強させて頂いています。 -- ao
  • 行を削除した後にソートを降順ソート、昇順ソート、初期状態と3回ソートを行うと削除した行が元に戻ってしまうようです。TestModel.javaremoveRowlist.remove(index);を追加したらうまくいきましたが、本当にこれでよいのでしょうか?-- ao
  • いいと思います。バグなので修正しておきますm(_ _m)。 あ、ダメみたいです。以下のように行番号をキーにして削除しないとソート中は別の行を削除してしまいます。 -- aterai
public void removeRow(int index) {
  Integer num = (Integer) getValueAt(index, 0);
  Test test = (Test) list.elementAt(num.intValue() - 1);
  list.removeElement(test);
  super.removeRow(index);
}
  • 初期状態に戻すのを止めたほうがいいかもしれません(エクスプローラも初期状態に戻したりしないし)。わざわざVectorlistを別に持つ必要も、キーとして番号の列を作る必要もなくなります。 -- aterai
  • こちらのサンプルでは初期状態に戻すのを止めてみました。初期状態戻し有りにしたい場合は、TableSorterでJTableをソートの方を参考にしてみてください。 -- aterai
  • ありがとうございます! -- G
    • どうもです。関係ない話ですが、元サンプル(SortableTableExample)が公開されているところを探してリンクを修正する予定です。 -- aterai