2010-10-07 31 views
5

我正在使用JTree。用於恢復狀態的jtree的存儲狀態/擴展節點

我想知道什麼是最好的方式來了解哪些節點在JTree中進行擴展以保存其狀態(即保存所有擴展路徑)。因此,如果我撥打model.reload(),Jtree不會保持摺疊狀態,但我可以將其原始狀態恢復給用戶,即所有展開的節點都將展開。

回答

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

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