Хранить состояние / расширенные узлы jtree для восстановления состояния

Я работаю с JTree.

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

3 ответа

Сантош Кумар - один из моих любимых парней в Swing Hacks.

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

Вам необходимо сохранить развернутые TreePath и снова развернуть их после перезагрузки TreeModel. Все TreePath, имеющие потомка, считаются развернутыми. PS если вы удалили пути, проверьте после перезагрузки, если путь все еще доступен.

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

Я новичок в 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);
        }   
    }
}

}
Другие вопросы по тегам