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

时间:2010-10-07 05:33:41

标签: java user-interface swing jtree treemodel

我正在与JTree合作。

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

3 个答案:

答案 0 :(得分:8)

Santhosh Kumar是Swing Hacks的最佳人选之一。

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

答案 1 :(得分:1)

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

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);
    }
}

答案 2 :(得分:0)

我是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);
        }   
    }
}

}