2010-10-07 2 views
5

Я работаю с JTree.Состояние хранилища/расширенные узлы jtree для состояния восстановления

Я хотел бы знать, что лучше всего узнать, какие узлы расширены в JTree, чтобы сохранить его состояние (т. Е. Сохранить все расширенные пути). Так что, если я позвоню model.reload(), Jtree не останется рухнувшим, но я смогу восстановить его исходное состояние пользователю, то есть все расширенные узлы будут расширены.

ответ

8

Santhosh Kumar является одним из моих ребята для Swing Hacks.

Ответ: http://www.javalobby.org/java/forums/t19857.html

+1

Г-н Кумар не хакер, он спаситель. Если бы он был ТАК, мой представитель застрял бы в -13. –

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

Вам необходимо сохранить TreePaths, которые были расширены и развернуть их снова после перезагрузки 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); 
    } 
}