存储jtree的状态/扩展节点以恢复状态

我正在和JTree合作。

我想知道什么是最好的方法来了解在JTree中扩展哪些节点以便保存其状态(即保存所有扩展路径)。 因此,如果我调用model.reload() ,Jtree将不会保持折叠状态,但我将能够将其原始状态恢复到用户,即,将扩展所有扩展节点。

Santhosh Kumar是Swing Hacks的首选之一。

答案: http : //www.javalobby.org/java/forums/t19857.html

您需要存储已展开的TreePath,并在重新加载TreeModel后再次展开它们。 具有后代的所有TreePath都被视为已扩展。 PS如果删除了路径,请在重新加载后检查路径是否仍然可用。

 public void reloadTree(JTree jYourTree) { List expanded = new ArrayList<>(); for (int i = 0; i < jYourTree.getRowCount() - 1; i++) { TreePath currPath = getPathForRow(i); TreePath nextPath = getPathForRow(i + 1); if (currPath.isDescendant(nextPath)) { expanded.add(currPath); } } ((DefaultTreeModel)jYourTree.getModel()).reload(); for (TreePath path : expanded) { jYourTree.expandPath(path); } } 

我是Java新手,这也让我疯狂。 但我想出来了……我想。 以下在我的应用程序中工作正常,但我认为它确实存在一些在某些特殊情况下无法正常工作的风险。

 import javax.swing.JTree; import javax.swing.tree.TreePath; public class TreeState { private final JTree tree; private StringBuilder sb; public TreeState(JTree tree){ this.tree = tree; } public String getExpansionState(){ sb = new StringBuilder(); for(int i =0 ; i < tree.getRowCount(); i++){ TreePath tp = tree.getPathForRow(i); if(tree.isExpanded(i)){ sb.append(tp.toString()); sb.append(","); } } return sb.toString(); } public void setExpansionState(String s){ for(int i = 0 ; i