Swing/TableRowSorter のバックアップ(No.21)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/TableRowSorter へ行く。
- 1 (2007-08-27 (月) 18:19:38)
- 2 (2007-10-16 (火) 15:51:55)
- 3 (2007-10-18 (木) 21:34:03)
- 4 (2007-11-19 (月) 16:59:03)
- 5 (2008-03-21 (金) 14:11:06)
- 6 (2008-05-14 (水) 13:43:19)
- 7 (2008-05-30 (金) 20:53:42)
- 8 (2008-06-20 (金) 13:38:02)
- 9 (2008-08-04 (月) 12:27:21)
- 10 (2008-08-25 (月) 14:47:10)
- 11 (2008-09-15 (月) 13:46:02)
- 12 (2010-08-04 (水) 19:22:45)
- 13 (2010-11-09 (火) 18:04:13)
- 14 (2011-02-04 (金) 15:17:39)
- 15 (2011-12-16 (金) 15:04:28)
- 16 (2013-02-09 (土) 23:41:58)
- 17 (2013-07-22 (月) 18:29:47)
- 18 (2013-07-22 (月) 21:12:08)
- 19 (2013-07-26 (金) 01:25:13)
- 20 (2013-10-14 (月) 00:12:38)
- 21 (2015-03-11 (水) 18:29:12)
- 22 (2015-03-28 (土) 15:36:39)
- 23 (2015-04-16 (木) 11:38:37)
- 24 (2016-05-27 (金) 15:59:01)
- 25 (2016-08-19 (金) 16:14:02)
- 26 (2016-09-02 (金) 12:35:23)
- 27 (2017-04-04 (火) 14:13:45)
- 28 (2017-04-04 (火) 14:17:08)
- 29 (2017-10-11 (水) 13:55:18)
- 30 (2017-11-02 (木) 15:32:16)
- 31 (2018-10-13 (土) 21:34:22)
- 32 (2018-11-08 (木) 17:46:53)
- 33 (2020-11-05 (木) 11:32:08)
- 34 (2022-10-14 (金) 13:42:44)
- title: TableRowSorterでJTableのソート tags: [JTable, TableRowSorter, JTableHeader] author: aterai pubdate: 2007-02-12 description: JDK 6で導入された、TableRowSorterを利用して、JTableの行を降順、昇順にソートします。
概要
JDK 6
で導入された、TableRowSorter
を利用して、JTable
の行を降順、昇順にソートします。
Screenshot
Advertisement
サンプルコード
TableModel model = makeTestTableModel();
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
View in GitHub: Java, Kotlin解説
JDK 6
では、JTable
にTableRowSorter
を設定することで、カラムヘッダのクリックによる行ソートが行えます。
以下のように、JTable#autoCreateRowSorter(true);
メソッドを使用した場合も、JTable
が自動的にRowSorter
を作成して、ソートが出来るようになります。
JTable table = new JTable(model);
table.setAutoCreateRowSorter(true);
TableRowSorter
のデフォルトでは、ヘッダクリックで(降順、昇順)とソートが切り替わり、TableSorter.java
のように(降順、昇順、初期状態)ではなくなっています。上記のサンプルでは、下のボタンをクリックすると、DefaultRowSorter#setSortKeys(List)
にnull
を代入することで初期状態に戻るようにしています。
SwingLabs
のJXTable
のように「Shift+ヘッダクリック」で初期状態TableSorter.java
のようにヘッダクリックで降順、昇順、初期状態とループ
第二キーを使ったソートは 複数キーを使ったソートも可能です(ページ下部にあるsyoさんのコメントを参照)。デフォルトではソートキーはTableRowSorter
版では出来ない?ようなので、TableSorter.java
を使う場合もまだあるかもしれません。3
つで、ヘッダにマークが表示されるのは最新のソートキーのみですが、クリックした順に保持されるようです。詳しくはドキュメントやTableの内容をソートなどを参照してください。
- Multisort Table Header Cell Renderer « Java Tips Weblog
- 第二キー以下を薄く表示するサンプルがあります。
- JTableの複数キーを使ったソートをヘッダに表示する
- ソートキーの状態を文字列にして追加しています。
TableModel
に要素を追加した後で、table.setRowSorter(sorter);
とすると、IndexOutOfBoundsException
:Invalid range
が、モデルへの追加、削除、編集中に別の行クリックなどで発生する。- 以下のサンプルの場合、
model.fireTableDataChanged()
メソッドをtable.setRowSorter(sorter)
の後で呼び出すと回避できる。
- 以下のサンプルの場合、
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class RowSorterTest extends JPanel{
public RowSorterTest() {
super(new BorderLayout());
final DefaultTableModel model = new DefaultTableModel(null, new String[] {"A","B","C"});
JTable table = new JTable(model);
TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
//table.setRowSorter(sorter); // OK
model.addRow(new String[] {"aa", "bb", "cc"});
model.addRow(new String[] {"dd", "ee", "ff"});
table.setRowSorter(sorter); // IndexOutOfBoundsException: Invalid range
//model.fireTableDataChanged(); // <----
add(new JButton(new AbstractAction("model.addRow(...); -> IndexOutOfBoundsException") {
@Override public void actionPerformed(ActionEvent e) {
model.addRow(new String[] {"gg", "hh", "ii"});
}
}), BorderLayout.SOUTH);
add(new JScrollPane(table));
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() { createAndShowGUI(); }
});
}
public static void createAndShowGUI() {
JFrame frame = new JFrame("Test");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.getContentPane().add(new RowSorterTest());
frame.setSize(320,240);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
- RowSorter (Java Platform SE 6)
RowSorter
の具象実装は、TableModel
、ListModel
などのモデルを参照する必要があります。JTable
やJList
などのビュークラスも、モデルを参照します。順序の依存性を回避するため、RowSorter
実装がモデル上にリスナーをインストールしないようにしてください。モデルが変更されると、ビュークラスがRowSorter
を呼び出します。例えば、TableModel
JTable
で行が更新された場合、rowsUpdated
が呼び出されます。モデルが変更されると、ビューは、modelStructureChanged
、allRowsChanged
、rowsInserted
、rowsDeleted
、rowsUpdated
のいずれかのメソッドを呼び出します。
参考リンク
- How to Use Tables
- TableSorterでJTableをソート
- TableRowSorterのSortKeysをクリアする
- TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更
- Tableの内容をソート