• 追加された行はこの色です。
  • 削除された行はこの色です。
---
title: JTableのSortKeyを永続化し、ソート状態の保存と復元を行う
tags: [JTable, RowSorter, XMLDecoder, XMLEncoder]
author: aterai
pubdate: 2015-09-21T01:26:03+09:00
description: JTableのSortKeyを永続化して、そのソート状態をXMLファイルで保存、復元できるように設定します。
---
* 概要 [#yb40aa78]
`JTable`の`SortKey`を永続化して、そのソート状態を`XML`ファイルで保存、復元できるように設定します。

#download(https://lh3.googleusercontent.com/-x9GESOvXeyc/Vf7c-CY1veI/AAAAAAAAOCE/lUO7hcq8-fw/s800-Ic42/SortKeyPersistence.png)

* サンプルコード [#y77bc390]
#code(link){{
File file = File.createTempFile("output", ".xml");
try (XMLEncoder xe = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(file)))) {
  xe.setPersistenceDelegate(
    RowSorter.SortKey.class,
    new DefaultPersistenceDelegate(new String[] {"column", "sortOrder"}));
  xe.writeObject(table.getRowSorter().getSortKeys());
//...
}}

* 解説 [#za98b6c2]
上記のサンプルでは、`JTable`のソート状態を表す`RowSorter.SortKey`を永続化するため、以下のような設定を行っています。

- `RowSorter.SortKey`クラスのコンストラクタの引数をプロパティ名として`DefaultPersistenceDelegate`を作成
- `RowSorter.SortKey`クラスを`XML`で書き出すため、`XMLEncoder#setPersistenceDelegate(...)`で上記の`PersistenceDelegate`を設定

- 注:
-- `TableModel`は、別途、[[JTableのモデルをXMLファイルで保存、復元する>Swing/PersistenceDelegate]]を使用
-- ヘッダカラムの幅や順序には対応していない
--- メモ: [http://wiki.byte-welt.net/wiki/JTable_Inhalte_speichern JTable Inhalte speichern – Byte-Welt Wiki]
--- または、以下のような`DefaultPersistenceDelegate`を使ってヘッダカラムの幅や順序を保存する方法がある

#code{{
class DefaultTableColumnModelPersistenceDelegate extends DefaultPersistenceDelegate {
  @Override protected void initialize(Class<?> type, Object oldInstance, Object newInstance, Encoder encoder) {
    super.initialize(type, oldInstance, newInstance, encoder);
    DefaultTableColumnModel m = (DefaultTableColumnModel) oldInstance;
    for (int col = 0; col < m.getColumnCount(); col++) {
      Object[] o = {m.getColumn(col)};
      encoder.writeStatement(new Statement(oldInstance, "addColumn", o));
    }
  }
}
}}

* 参考リンク [#bd8de50f]
- [[JTableのモデルをXMLファイルで保存、復元する>Swing/PersistenceDelegate]]

* コメント [#m7e19549]
#comment
#comment