存储JTree的状态/展开节点以便恢复状态

8

我正在使用 JTree。

我想知道如何最好地知道哪些节点在 JTree 中已展开,以便保存其状态(即保存所有扩展的路径)。这样,如果我调用 model.reload(),JTree 不会保持折叠状态,而是能够将其原始状态恢复给用户,即所有展开的节点都将被展开。

3个回答

7

1
库马尔先生不是黑客,他是救世主。如果他在 Stack Overflow 上,我的声望将会停留在 -13。 - Geoffrey Zheng
该网站已不存在,但仍被标记为最佳答案。 - b005t3r

3

在重新加载TreeModel之后,您需要存储已展开的TreePaths并再次展开它们。所有具有后代的TreePaths都被认为是已展开的。顺便说一下,如果删除了路径,请在重新加载后检查路径是否仍然可用。

public void reloadTree(JTree jYourTree) {
    List<TreePath> 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);
    }
}

1

我是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<tree.getRowCount(); i++){
        TreePath tp = tree.getPathForRow(i);
        if(s.contains(tp.toString() )){
            tree.expandRow(i);
        }   
    }
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接