TITLE:JTableのソート

JTableのソート

編集者:Terai Atsuhiro~

作成日:2004-01-05
更新日:2024-04-18 (木) 14:47:21
  • category: swing folder: SortableTable title: JTableのソート tags: [JTable, JTableHeader] author: aterai pubdate: 2004-01-05 description: JTableのカラムヘッダをクリックすることで、行表示を降順、昇順にソートします。 image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTTXXYDR5I/AAAAAAAAAkQ/DeBHN6piDhQ/s800/SortableTable.png

概要

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

概要

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

#screenshot

サンプルコード

#spanend
#spandel
class SortableTableModel extends DefaultTableModel{
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
class SortableTableModel extends DefaultTableModel {
#spanend
  public SortableTableModel(String[] str, int row) {
    super(str, row);
  }
#spanadd

#spanend
  public void sortByColumn(int column, boolean isAscent) {
    Collections.sort(getDataVector(), new ColumnComparator(column, isAscent));
    Collections.sort(
      getDataVector(),
      new ColumnComparator(column, isAscent));
    fireTableDataChanged();
  }
}
#spandel
class ColumnComparator implements Comparator{
#spanend
  final protected int index;
  final protected boolean ascending;
  public ColumnComparator(int index, boolean ascending) {
#spanadd

#spanend
#spanadd
class ColumnComparator implements Comparator<Object>, Serializable {
#spanend
  private static final long serialVersionUID = 1L;
  protected final int index;
  protected final boolean ascending;
#spanadd

#spanend
  protected 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);
      }
#spanadd

#spanend
  @SuppressWarnings("unchecked")
  @Override public int compare(Object one, Object two) {
    if (one instanceof List && two instanceof List) {
      Comparable<Object> o1 =
        (Comparable<Object>) ((List<Object>) one).get(index);
      Comparable<Object> o2 =
        (Comparable<Object>) ((List<Object>) two).get(index);
      int c = Objects.compare(
          o1, o2, Comparator.nullsFirst(
            Comparator.<Comparable<Object>>naturalOrder()));
      return c * (ascending ? 1 : -1);
    }
    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;
    }
  }
    return 0;
}
  • &jnlp;
  • &jar;
  • &zip;

解説

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

解説

上記のサンプルでは、各カラムヘッダのクリックでソート可能になっています。 複数の列をキーにしてソートしたい場合や、ヘッダがボタンになるのがいやな場合は、TableSorterでJTableをソートを参照してください。

参考リンク

参考リンク

コメント

  • 非常に参考になりました。すぐに実装に使わせていただきます。 -- akio
  • カラムをドラッグして移動したとき、矢印が残ってしまうようです。元からだったかデグレードしたのかちょっと不明です。 元からのようです。 -- terai
  • 修正できたかな?確認中。 確認済み。 -- terai
  • Swing初心者の為このサイトのソースを参考に勉強させて頂いています。 -- ao
  • 行を削除した後にソートを降順ソート、昇順ソート、初期状態と3回ソートを行うと削除した行が元に戻ってしまうようです。 TestModel.javaのremoveRowにlist.remove(index);を追加したらうまくいきましたが、本当にこれでよいのでしょうか?-- ao
  • いいと思います。バグなので修正しておきますm(_ _m)。 あ、ダメみたいです。以下のように行番号をキーにして削除しないとソート中は別の行を削除してしまいます。 -- terai

コメント