我想创建一个反映目录结构但是已成功加载的JTree。
我有dir结构:
c:\root
-------\dir1
------------\file1
------------\file2
-------\dir2
我知道如何加载到第一级目录(dir1,dir2)的JTree节点结构。但我不想只在用户扩展特定节点时才搜索每个目录中的文件,以节省时间和资源。
因为上面我想为每个节点添加加号图标(或特定java风格的等价物),即使它是空的,以便建议这个目录中的用户可以是文件。此外,当dir为空时,用户将展开节点(并将执行搜索),我想删除任何图标
有什么办法吗?
答案 0 :(得分:1)
我认为DefaultTreeModel#setAsksAllowsChildren(boolean)正是您所寻找的。 p>
通过向TreeNodes询问getAllowsChildren()或isLeaf()来设置是否测试叶度。如果newValue为true,则getAllowsChildren()被消息,否则isLeaf()被消息。
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class AsksAllowsChildrenTest {
private JComponent makeUI() {
DefaultTreeModel model = makeDefaultTreeModel();
model.setAsksAllowsChildren(true);
JPanel p = new JPanel(new GridLayout(1, 2));
p.add(new JScrollPane(new JTree(makeDefaultTreeModel())));
p.add(new JScrollPane(new JTree(model)));
return p;
}
private static DefaultTreeModel makeDefaultTreeModel() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("c:/root");
DefaultMutableTreeNode dir;
dir = new DefaultMutableTreeNode("dir1");
root.add(dir);
dir.add(new DefaultMutableTreeNode("file1", false));
dir.add(new DefaultMutableTreeNode("file2", false));
dir = new DefaultMutableTreeNode("dir2");
root.add(dir);
return new DefaultTreeModel(root);
}
public static void main(String... args) {
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new AsksAllowsChildrenTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}