2010-10-07 9 views
5

Pracuję z JTree.Stan sklepu/rozszerzone węzły jtree do przywracania stanu

Chciałbym wiedzieć, jaki jest najlepszy sposób, aby wiedzieć, które węzły są rozszerzane w JTree, aby zapisać jego stan (tj. Zapisać wszystkie rozszerzone ścieżki). Tak więc, jeśli zadzwonię pod numer model.reload(), Jtree nie pozostanie zwinięty, ale będę mógł przywrócić jego pierwotny stan użytkownikowi, tj. Wszystkie rozwinięte węzły zostaną rozszerzone.

Odpowiedz

0

Jestem nowy Java i to zawiózł mnie do szału, jak również. Ale domyśliłem się ... Myślę. Poniżej działa dobrze w mojej aplikacji, ale myślę, że istnieje ryzyko nie działać zgodnie z oczekiwaniami w niektórych niezwykłych okolicznościach.

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

Musisz przechowywać TreePaths, które zostały rozwinięte i rozwinąć je ponownie po ponownym załadowaniu TreeModel. Wszystkie TreePaths, które mają potomka są uważane za rozszerzone. P.S. jeśli usunięto ścieżki, sprawdź po przeładowaniu, jeśli ścieżka jest nadal dostępna.

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); 
    } 
} 
Powiązane problemy