【问题标题】:store state/expanded nodes of a jtree for restoring state存储 jtree 的状态/扩展节点以恢复状态
【发布时间】:2010-10-07 05:33:41
【问题描述】:

我正在使用 JTree。

我想知道在 JTree 中扩展哪些节点以保存其状态(即保存所有扩展路径)的最佳方法是什么。这样,如果我调用model.reload(),Jtree 就不会保持折叠状态,但我将能够将其原始状态还原给用户,即所有展开的节点都将展开。

【问题讨论】:

    标签: java user-interface swing jtree treemodel


    【解决方案1】:

    Santhosh Kumar 是 Swing Hacks 的首选人之一。

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

    【讨论】:

    • 先生。 Kumar 不是黑客,他是救世主。如果他在 SO,我的代表将被困在 -13。
    【解决方案2】:

    您需要存储已展开的 TreePath,并在重新加载 TreeModel 后再次展开它们。所有具有后代的 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-17
        • 1970-01-01
        • 2018-06-06
        • 1970-01-01
        • 2019-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多