7

私はJTreeで作業しています。

どのノードが JTree で展開され、その状態を保存する (つまり、すべての展開されたパスを保存する) かを知る最善の方法を知りたいです。そのため、Jtreeを呼び出しmodel.reload()ても折りたたまれたままではなく、元の状態をユーザーに復元できます。つまり、展開されたすべてのノードが展開されます。

4

3 に答える 3

8

Santhosh Kumarは、SwingHacksの頼りになる人の1人です。

回答: http ://www.javalobby.org/java/forums/t19857.html

于 2010-10-07T12:13:28.197 に答える
3

展開された 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);
    }
}
于 2017-01-20T16:11:38.713 に答える
0

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

}
于 2014-07-10T18:15:58.483 に答える