设置新的树模型时如何自动扩展 JTree?

2022-09-01 21:33:25

我有一个习俗和一个习俗;当我给JTree一个新模型时,我会让它“自动扩展”。目前,它只是将所有节点折叠到根目录。JTreeJModel

下面是一个示例:

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));

此时,树将正确显示:

- BOB
  - ALICE

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

但是,如果我调用:

tree.setModel(new CustomTreeModel(model));

一切都崩溃了:

+ BOB

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


答案 1

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

for (int i = 0; i < tree.getRowCount(); i++) {
    tree.expandRow(i);
}

答案 2

我遇到了类似的问题。

您的解决方案(如 https://stackoverflow.com/a/15211697/837530 发布的那样)似乎仅适用于顶级树节点。

但我需要展开所有后代节点。所以我用下面的递归方法解决了它:

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());
    }
}

调用方式为

expandAllNodes(tree, 0, tree.getRowCount());

其中,是 .treeJTree

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


推荐