我正在使用 JTree。
我想知道什么是知道哪些节点在 JTree 中展开以保存其状态(即保存所有展开的路径)的最佳方法。这样,如果我调用model.reload()
Jtree 就不会一直处于折叠状态,而是能够将其原始状态还原给用户,即所有展开的节点都会被展开。
我正在使用 JTree。
我想知道什么是知道哪些节点在 JTree 中展开以保存其状态(即保存所有展开的路径)的最佳方法。这样,如果我调用model.reload()
Jtree 就不会一直处于折叠状态,而是能够将其原始状态还原给用户,即所有展开的节点都会被展开。
Santhosh Kumar 是我的 Swing Hacks 的首选人之一。
您需要存储已展开的 TreePath,并在重新加载 TreeModel 后再次展开它们。所有具有后代的 TreePaths 都被认为是扩展的。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);
}
}
}
}