Swing/SortableTable のバックアップの現在との差分(No.18)
TITLE:JTableのソート
Posted by aterai at 2004-01-05
JTableのソート
JTableのヘッダカラムをクリックすることで、行表示を降順、昇順にソートします。以下のサンプルは、SortableTableExampleを参考にして作成しています。- category: swing folder: SortableTable title: JTableのソート tags: [JTable, JTableHeader] author: aterai pubdate: 2004-01-05 description: JTableのカラムヘッダをクリックすることで、行表示を降順、昇順にソートします。 image:
概要
JTable
のカラムヘッダをクリックすることで、行表示を降順、昇順にソートします。以下のサンプルは、- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
#spandel
class SortableTableModel extends DefaultTableModel{
#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;
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、カラムヘッダをクリックすることでソートできます。右クリックからポップアップメニューで、行を追加、削除したり、セルをダブルクリックして中身を色々編集するなどしてソートを試してみてください。解説
上記のサンプルでは、各カラムヘッダのクリックでソート可能になっています。 複数の列をキーにしてソートしたい場合や、ヘッダがボタンになるのがいやな場合は、TableSorterでJTableをソートを参照してください。- 複数の列をキーにしてソートしたい場合は
TableSorter.java
が利用可能 -
JDK 1.6.0
からJTable
のソートが標準機能として追加された
参考リンク
-
SortableTableExample - Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)
参考リンク
- SortableTableExample
- Sorting and Otherwise Manipulating Data - How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)
コメント
- 非常に参考になりました。すぐに実装に使わせていただきます。 -- akio
- カラムをドラッグして移動したとき、矢印が残ってしまうようです。
元からかデグレードしたのかちょっと不明です。元からのようです。 -- aterai - 修正できたかな?
確認中。確認済み。 -- aterai -
Swing
初心者の為このサイトのソースを参考に勉強させて頂いています。 -- ao - 行を削除した後にソートを降順ソート、昇順ソート、初期状態と3回ソートを行うと削除した行が元に戻ってしまうようです。
TestModel.java
のremoveRow
にlist.remove(index);
を追加したらうまくいきましたが、本当にこれでよいのでしょうか? -- ao -
いいと思います。バグなので修正しておきますm(_ _m)。あ、ダメみたいです。以下のように行番号をキーにして削除しないとソート中は別の行を削除してしまいます。 -- aterai
コメント
- 非常に参考になりました。すぐに実装に使わせていただきます。 -- akio?
- カラムをドラッグして移動したとき、矢印が残ってしまうようです。
元からだったかデグレードしたのかちょっと不明です。元からのようです。 -- aterai - 修正できたかな?
確認中。確認済み。 -- aterai - Swing初心者の為このサイトのソースを参考に勉強させて頂いています。 -- ao?
- 行を削除した後にソートを降順ソート、昇順ソート、初期状態と3回ソートを行うと削除した行が元に戻ってしまうようです。 TestModel.javaのremoveRowにlist.remove(index);を追加したらうまくいきましたが、本当にこれでよいのでしょうか?-- ao?
いいと思います。バグなので修正しておきますm(_ _m)。あ、ダメみたいです。以下のように行番号をキーにして削除しないとソート中は別の行を削除してしまいます。 -- ateraipublic void removeRow(int index) { Integer num = (Integer)getValueAt(index, 0); Test test = (Test)list.elementAt(num.intValue()-1); Integer num = (Integer) getValueAt(index, 0); Test test = (Test) list.elementAt(num.intValue() - 1); list.removeElement(test); super.removeRow(index); }
- 初期状態に戻すのを止めたほうがいいかもしれません(エクスプローラも初期状態に戻したりしないし)。わざわざVectorでlistを別に持つ必要も、キーとして番号の列を作る必要もなくなります。 -- aterai
- こちらのサンプルでは初期状態に戻すのを止めてみました。初期状態戻し有りにしたい場合は、TableSorterでJTableをソートの方を参考にしてみてください。 -- aterai
- ありがとうございます! -- G?
- 初期状態に戻すのを止めたほうがいいかもしれません(エクスプローラも初期状態に戻したりしないし)。わざわざ
Vector
でlist
を別に持つ必要も、キーとして番号の列を作る必要もなくなります。 -- aterai - こちらのサンプルでは初期状態に戻すのを止めてみました。初期状態戻し有りにしたい場合は、TableSorterでJTableをソートの方を参考にしてみてください。 -- aterai
- ありがとうございます! -- G
- どうもです。関係ない話ですが、元サンプル(
SortableTableExample
)が公開されているところを探してリンクを修正する予定です。 -- aterai
- どうもです。関係ない話ですが、元サンプル(