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)
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)
在哪里,tree是JTree.
除非有人有更好的解决方案.
还有这个非递归版本.
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)