JTree具有可扩展的空父项

时间:2014-11-18 08:11:47

标签: java swing directory jtree expand

我想创建一个反映目录结构但是已成功加载的JTree。

我有dir结构:

c:\root
-------\dir1
------------\file1
------------\file2
-------\dir2

我知道如何加载到第一级目录(dir1,dir2)的JTree节点结构。但我不想只在用户扩展特定节点时才搜索每个目录中的文件,以节省时间和资源。

因为上面我想为每个节点添加加号图标(或特定java风格的等价物),即使它是空的,以便建议这个目录中的用户可以是文件。此外,当dir为空时,用户将展开节点(并将执行搜索),我想删除任何图标 有什么办法吗?

1 个答案:

答案 0 :(得分:1)

我认为DefaultTreeModel#setAsksAllowsChildren(boolean)正是您所寻找的。

  

通过向TreeNodes询问getAllowsChildren()或isLeaf()来设置是否测试叶度。如果newValue为true,则getAllowsChildren()被消息,否则isLeaf()被消息。

enter image description here

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