Swing/TableRowSorter のバックアップの現在との差分(No.13)
TITLE:TableRowSorterでJTableのソート
Posted by terai at 2007-02-12
TableRowSorterでJTableのソート
JDK 6 で導入された、TableRowSorterを利用して、JTableの行を降順、昇順にソートします。- category: swing folder: TableRowSorter title: TableRowSorterでJTableのソート tags: [JTable, TableRowSorter, JTableHeader] author: aterai pubdate: 2007-02-12T18:36:03+09:00 description: JDK 6で導入されたTableRowSorterを利用してJTableの行を降順、昇順にソートします。 image:
概要
JDK 6
で導入されたTableRowSorter
を利用してJTable
の行を降順、昇順にソートします。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
#screenshot
サンプルコード
#spanend
#spandel
TestModel model = new TestModel();
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
TableModel model = makeTestTableModel();
#spanend
JTable table = new JTable(model);
RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
table.setRowSorter(sorter);
解説
JDK 6 では、JTableにTableRowSorterを設定することで、カラムヘッダのクリックによる行ソートが行えます。解説
JDK 6
ではJTable
にTableRowSorter
を設定することでカラムヘッダのクリックによる行ソートが行えます。
以下のように、JTable#autoCreateRowSorter(true); メソッドを使用した場合も、JTable が自動的に RowSorter を作成して、ソートが出来るようになります。
- 以下のように
JTable#autoCreateRowSorter(true)
メソッドを使用した場合も、JTable
が自動的にRowSorter
を作成してソートが可能になるJTable table = new JTable(model); table.setAutoCreateRowSorter(true);
TableRowSorterのデフォルトでは、ヘッダクリックで(降順、昇順)とソートが切り替わり、TableSorterのように(降順、昇順、初期状態)ではなくなっています。上記のサンプルでは、下のボタンをクリックすると、DefaultRowSorter#setSortKeys(List)にnullを代入することで初期状態に戻るようにしています。
- SwingLabsのJXTableのように「Shift+ヘッダクリック」で初期状態
- TableSorter.javaのようにヘッダクリックで降順、昇順、初期状態とループ
-
TableRowSorter
のデフォルトではヘッダクリックで(降順、昇順)とソートが切り替わり、TableSorter.java
のように(降順、昇順、初期状態)ではなくなっている- このページのサンプルでは
BorderLayout.SOUTH
に配置したボタンをクリックするとDefaultRowSorter#setSortKeys(List)
にnull
を代入することで初期状態に戻るよう設定している
- このページのサンプルでは
-
SwingLabs
のJXTable
のように「Shift+ヘッダクリック」で初期状態に戻す -
TableSorter.java
のようにヘッダクリックで降順、昇順、初期状態とループ
-
第二キーを使ったソートはTableRowSorter
版では存在しない?ためTableSorter.java
を使う場合もまだあるかもしれない。 -
TableRowSorter
でもTableSorter.java
と同様に複数キーを使ったソートが可能- ページ下部にあるsyoさんのコメントを参照
- デフォルトではソートキーは
3
つまでクリックした順に保持されるが、ヘッダにマークが表示されるのは最新のソートキーのみ- 参考: Tableの内容をソート
- Multisort Table Header Cell Renderer « Java Tips Weblog
- 第二キー以下を薄く表示するサンプルがある
- JTableの複数キーを使ったソートをヘッダに表示する
- ソートキーの状態を文字列にして追加
参考リンク
- How to Use Tables
- TableSorterでJTableをソート
- TableRowSorterのSortKeysをクリアする
- TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更
- Tableの内容をソート
- -
-
TableModel
に要素を追加した後でtable.setRowSorter(sorter);
とすると、IndexOutOfBoundsException
:Invalid range
がモデルへの追加、削除、編集中に別の行クリックなどで発生する- 以下のサンプルの場合
model.fireTableDataChanged()
メソッドをtable.setRowSorter(sorter)
の後で呼び出すと回避可能
- 以下のサンプルの場合
コメント
- DefaultRowSorter#setMaxSortKeys(int)で複数のキーを用いたソートも出来ているように思います(b86)。ただ、ヘッダー部分がわかりにくいですが。 -- syo?
- ご指摘ありがとうございます。なるほど、こちら(Tableの内容をソート)を使えばうまくいきそうですね。 -- terai
- rendererがないので、基本的に数字は左揃え、文字列は右揃えで、中央揃えするにはどうすれば宜しいでしょうか? -- パンダ?
- 長いのでJTableのセル文字揃えに移動しました。 -- terai
#spanend #spanadd import java.awt.*; #spanend #spanadd import java.awt.event.*; #spanend #spanadd import javax.swing.*; #spanend #spanadd import javax.swing.table.*; #spanend #spanadd public class RowSorterTest extends JPanel { #spanend 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)); } #spanadd #spanend public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { createAndShowGUI(); } }); } #spanadd #spanend 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); } #spanadd } #spanend #spanadd
- 長いのでJTableのセル文字揃えに移動しました。 -- terai
- RowSorter (Java Platform SE 8)
RowSorter
の具象実装は、TableModel
、ListModel
などのモデルを参照する必要があります。JTable
やJList
などのビュークラスも、モデルを参照します。順序の依存性を回避するため、RowSorter
実装がモデル上にリスナーをインストールしないようにしてください。モデルが変更されると、ビュークラスがRowSorter
を呼び出します。例えば、TableModel
JTable
で行が更新された場合、rowsUpdated
が呼び出されます。モデルが変更されると、ビューは、modelStructureChanged
、allRowsChanged
、rowsInserted
、rowsDeleted
、rowsUpdated
のいずれかのメソッドを呼び出します。
参考リンク
- TableRowSorter (Java Platform SE 8)
- How to Use Tables
- TableSorterでJTableをソート
- TableRowSorterのSortKeysをクリアする
- TableRowSorterのソートをヘッダクリックで昇順、降順、初期状態に変更
- Tableの内容をソート