---
category: swing
folder: UserObjectPersistence
title: JTreeのノードに追加したJCheckBoxのチェック状態の保存と復元
tags: [JTree, JCheckBox, XMLEncoder, XMLDecoder]
author: aterai
pubdate: 2016-04-25T00:07:44+09:00
description: JTreeのノードに追加したJCheckBoxのチェック状態など保持するUserObjectを永続化可能になるよう設定し、その保存と復元を行います。
image: https://lh3.googleusercontent.com/-Foeg7fF4Uj4/VxzbvHpNTUI/AAAAAAAAOTY/LnDkJRi6CtQXJcQAGJ2boc27LJrY_lT-QCCo/s800/UserObjectPersistence.png
---
* 概要 [#summary]
`JTree`のノードに追加した`JCheckBox`のチェック状態など保持する`UserObject`を永続化可能になるよう設定し、その保存と復元を行います。

#download(https://lh3.googleusercontent.com/-Foeg7fF4Uj4/VxzbvHpNTUI/AAAAAAAAOTY/LnDkJRi6CtQXJcQAGJ2boc27LJrY_lT-QCCo/s800/UserObjectPersistence.png)

* サンプルコード [#sourcecode]
#code(link){{
try {
  File file = new File("output.xml");
  try (XMLEncoder xe = new XMLEncoder(
      new BufferedOutputStream(new FileOutputStream(file)))) {
    xe.setPersistenceDelegate(
        CheckBoxNode.class,
        new DefaultPersistenceDelegate(new String[] {"label", "status"}));
    xe.writeObject(tree.getModel());
  }
} catch (IOException ex) {
  ex.printStackTrace();
}
}}

* 解説 [#explanation]
上記のサンプルでは、[[JTreeのすべてのノードにJCheckBoxを追加する>Swing/CheckBoxNodeEditor]]などで使用しているチェックボックス付き`JTree`を、そのチェック状態も含めて永続化を行っています。

- `JTree`の`DefaultTreeModel`や`DefaultMutableTreeNode`はデフォルトで`XMLEncoder`に対応
- `UserObject`として名前とチェック状態を保持する`CheckBoxNode`クラスは`XMLEncoder`に未対応なので、`DefaultPersistenceDelegate`で書き出し保存するプロパティを指定
- `UserObject`として名前とチェック状態を保持する`CheckBoxNode`クラスは`XMLEncoder`に未対応なので`DefaultPersistenceDelegate`で書き出し保存するプロパティを指定
- チェック状態を表す`Status`は列挙型(`Enum`)で作成しているため`XMLEncoder`はデフォルトで永続化に対応
-- `public`なクラスにしておく必要がある
- 親ノードなどのチェック状態を更新する`TreeModelListener`は永続化していないので、`XMLDecoder`で`DefaultTreeModel`を復元後に再度`addTreeModelListener(...)`で設定し直す必要がある
- 親ノードなどのチェック状態を更新する`TreeModelListener`は永続化していないので`XMLDecoder`で`DefaultTreeModel`を復元後に再度`addTreeModelListener(...)`で設定し直す必要がある

* 参考リンク [#reference]
- [[JTableのSortKeyを永続化し、ソート状態の保存と復元を行う>Swing/SortKeyPersistence]]
- [[JTreeのすべてのノードにJCheckBoxを追加する>Swing/CheckBoxNodeEditor]]
- [[JTreeの展開状態を記憶・復元する>Swing/ExpandedDescendants]]

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