Хранить состояние / расширенные узлы jtree для восстановления состояния
Я работаю с JTree.
Я хотел бы знать, что является лучшим способом узнать, какие узлы раскрываются в JTree, чтобы сохранить его состояние (т.е. сохранить все расширенные пути). Так что если я позвоню model.reload()
Jtree не останется свернутым, но я смогу восстановить его исходное состояние для пользователя, т.е. все развернутые узлы будут расширены.
3 ответа
Сантош Кумар - один из моих любимых парней в Swing Hacks.
Вам необходимо сохранить развернутые 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);
}
}
}
}