我正在使用JTree。用於恢復狀態的jtree的存儲狀態/擴展節點
我想知道什麼是最好的方式來了解哪些節點在JTree中進行擴展以保存其狀態(即保存所有擴展路徑)。因此,如果我撥打model.reload()
,Jtree不會保持摺疊狀態,但我可以將其原始狀態恢復給用戶,即所有展開的節點都將展開。
我正在使用JTree。用於恢復狀態的jtree的存儲狀態/擴展節點
我想知道什麼是最好的方式來了解哪些節點在JTree中進行擴展以保存其狀態(即保存所有擴展路徑)。因此,如果我撥打model.reload()
,Jtree不會保持摺疊狀態,但我可以將其原始狀態恢復給用戶,即所有展開的節點都將展開。
Santhosh Kumar是Swing Hacks的一名頂級球員。
我是新來的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);
}
}
}
}
您需要存儲已擴展的TreePath並在重新加載TreeModel後再次展開它們。所有具有後代的TreePath都被視爲展開。附:如果您刪除了路徑,請在重新加載後檢查路徑是否仍然可用。
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);
}
}
庫馬爾先生不是黑客,他是個救世主。如果他在SO上,我的代表將被卡在-13。 – 2010-10-07 13:05:59