在设置新的TreeModel时如何自动扩展JTree?

sda*_*das 18 java tree swing jtree

我有自定义JTree和习惯JModel; 当我给它一个新的模型时,我会让JTree"自动扩展".目前,它只是将所有节点折叠到根目录.

这是一个例子:

private class CustomTree extends JTree {

    @Override
    public boolean isExpanded(TreePath path) {
        return ((Person) path.getLastPathComponent).hasChildren();

}

private class CustomTreeModel extends TreeModel {

    // ... omitting various implementation details

    @Override
    public boolean isLeaf(Object object) {
        return !((Person) object).hasChildren();
    }

}

Model model = new Model();
Person bob = new Person();
Person alice = new Person();
bob.addChild(alice);
model.setRoot(bob);
JTree tree = new CustomTree(new CustomTreeModel(model));
Run Code Online (Sandbox Code Playgroud)

此时,树正确显示:

- BOB
  - ALICE
Run Code Online (Sandbox Code Playgroud)

Alice是Bob的孩子(在数据和可视化树中)

但是,如果我打电话:

tree.setModel(new CustomTreeModel(model));
Run Code Online (Sandbox Code Playgroud)

一切都崩溃了:

+ BOB
Run Code Online (Sandbox Code Playgroud)

在设置新模型时,有没有办法"自动扩展"树中的所有内容?

sda*_*das 37

以下对我有用(在设置新模型后调用):

for (int i = 0; i < tree.getRowCount(); i++) {
    tree.expandRow(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 至于"为什么":它起作用,因为`expandRow()`将显示更多行,使得每次扩展后`getRowCount()`增加.通过存储`n = getRowCount()`和`for(i = 0; i <n; i ++)`来试图变得聪明不会起作用. (10认同)
  • @all:这个解决方案已经足够了,不需要递归 (2认同)

Sa'*_*'ad 19

我遇到了类似的问题.

您的解决方案(如发布的/sf/answers/1064818821/)似乎仅适用于顶级树节点.

但我需要扩展所有后代节点.所以我用以下递归方法解决了它:

private void expandAllNodes(JTree tree, int startingIndex, int rowCount){
    for(int i=startingIndex;i<rowCount;++i){
        tree.expandRow(i);
    }

    if(tree.getRowCount()!=rowCount){
        expandAllNodes(tree, rowCount, tree.getRowCount());
    }
}
Run Code Online (Sandbox Code Playgroud)

用它调用

expandAllNodes(tree, 0, tree.getRowCount());
Run Code Online (Sandbox Code Playgroud)

在哪里,treeJTree.

除非有人有更好的解决方案.


Con*_*orR 9

还有这个非递归版本.

private void expandAllNodes(JTree tree) {
    int j = tree.getRowCount();
    int i = 0;
    while(i < j) {
        tree.expandRow(i);
        i += 1;
        j = tree.getRowCount();
    }
}
Run Code Online (Sandbox Code Playgroud)