• 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

概要

JTreeのノードに追加したJCheckBoxのチェック状態など保持するUserObjectを永続化可能になるよう設定し、その保存と復元を行います。

サンプルコード

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();
}
View in GitHub: Java, Kotlin

解説

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

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

参考リンク

コメント