Swing/ExpandedDescendants のバックアップの現在との差分(No.7)
- category: swing folder: ExpandedDescendants title: JTreeの展開状態を記憶・復元する tags: [JTree, TreePath] author: aterai pubdate: 2013-11-18T00:04:12+09:00 description: JTreeでノードの展開状態を記憶、復元します。 description: JTreeのノードが展開されているかどうかを記憶、復元します。 image:
概要
JTree
でノードの展開状態を記憶、復元します。
概要
JTree
のノードが展開されているかどうかを記憶、復元します。
Screenshot
Advertisement
サンプルコード
サンプルコード
visitAll(tree, rootPath, false); //Collapse all
if (expandedState == null) {
return;
}
while (expandedState.hasMoreElements()) {
tree.expandPath(expandedState.nextElement());
}
expandedState = tree.getExpandedDescendants(rootPath);
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTree#getExpandedDescendants(TreePath)
メソッドを使用して、展開されているノードのTreePath
をEnumeration
に保存しています。復元は一旦すべてのノードを折り畳んでから、JTree#expandPath(TreePath)
メソッドを使用してEnumeration<TreePath>
から取得したノードを展開しています。
解説
上記のサンプルでは、JTree#getExpandedDescendants(TreePath)
メソッドを使用して展開されているノードのTreePath
をEnumeration
に保存しています。復元は一旦すべてのノードを折り畳んでからJTree#expandPath(TreePath)
メソッドを使用してEnumeration<TreePath>
から取得したノードを展開しています。
- 注:
- 親ノードが閉じている場合、その子ノードの展開状態は記憶していない
- このサンプルでの例を挙げると、
Set 004
を展開して、親のSet 001
を折り畳んだ状態で、JTree#getExpandedDescendants(TreePaht)
を使用した場合、戻り値のEnumeration<TreePath>
にSet 004
へのパスは含まれない
- このサンプルでの例を挙げると、
- JTree#getExpandedDescendants(TreePath) (Java Platform SE 7)に書かれている説明がよく分からない(特に前半)が、もしかしたら上記のことを言っているのかもしれない…
- 親ノードが閉じている場合、その子ノードの展開状態は記憶していない
- 親ノードが閉じている場合、その子ノードの展開状態は記憶していない
- このサンプルでの例を挙げると
Set 004
を展開して親のSet 001
を折り畳んだ状態でJTree#getExpandedDescendants(TreePath)
を使用した場合、戻り値のEnumeration<TreePath>
にSet 004
へのパスは含まれない
- このサンプルでの例を挙げると
- JTree#getExpandedDescendants(TreePath)メソッドのドキュメントの説明がよく分からない(特に前半)がもしかしたら上記のことを言っているのかもしれない…
If you expand/collapse nodes while iterating over the returned Enumeration this may not return all the expanded paths, or may return paths that are no longer expanded. 返された Enumeration で繰り返している間ノードを展開するか、折りたたむと、このメソッドは展開されたすべてのパスを返すのではなく、それ以上展開されていないパスを返します。
JTree
のシリアライズに関するのメモ
#spandel
//XMLEncoderではデフォルトのJTreeの場合、展開状態などは保存されない
#spanend
#spanadd
// XMLEncoderではデフォルトのJTreeの場合、展開状態などは保存されない
#spanend
try (XMLEncoder xe = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(xmlFile)))) {
xe.writeObject(tree);
//xe.close();
//...
// xe.close();
// ...
//ObjectOutputStreamの場合は、選択状態、展開状態なども保存、復元可能
// ObjectOutputStreamの場合は、選択状態、展開状態なども保存、復元可能
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file));
oos.writeObject(tree);
//...
// ...
参考リンク
参考リンク
- JTree#getExpandedDescendants(TreePath) (Java Platform SE 8)
- JTreeのノードを展開・折り畳み
- Swing: Retaining JTree Expansion State
- OR in an OB World: Auto-collapsing Tree in Java