Java JTree:为什么我的目录不';不象目录吗?

Java JTree:为什么我的目录不';不象目录吗?,java,nodes,jtree,expand,Java,Nodes,Jtree,Expand,在探索JTree组件时,我编写了一个小类,它将列出我硬盘上的目录和文件。为了避免“完整扫描”耗时数分钟,浪费时间和资源,我决定只探索“活动节点”的1个子级别。所谓“活动节点”,我指的是目录被点击或节点被展开 对于单击的目录,它工作得非常完美:我可以浏览我的目录和子目录,代码“逐级”工作,单击的目录看起来像目录 但是如果我扩展一个节点,它就会失败!探索此节点的子节点运行的方法;它可以找到所有的子目录并通过“System.out.println(…)”列出它们,但是我的目录仍然像文件一样显示,即使它

在探索JTree组件时,我编写了一个小类,它将列出我硬盘上的目录和文件。为了避免“完整扫描”耗时数分钟,浪费时间和资源,我决定只探索“活动节点”的1个子级别。所谓“活动节点”,我指的是目录被点击或节点被展开

对于单击的目录,它工作得非常完美:我可以浏览我的目录和子目录,代码“逐级”工作,单击的目录看起来像目录

但是如果我扩展一个节点,它就会失败!探索此节点的子节点运行的方法;它可以找到所有的子目录并通过“System.out.println(…)”列出它们,但是我的目录仍然像文件一样显示,即使它们有子目录。要使目录看起来像目录,我必须单击它(=使用“第一种方法”)

这是我的密码。有人能解释我失败的原因吗

import java.awt.BorderLayout;
import java.io.File;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

public class Explorer2 extends JPanel {
private JTree tree;
private DefaultMutableTreeNode root= new DefaultMutableTreeNode();
int countSubLevel=0;
int limit=1;

Explorer2() {
    DefaultMutableTreeNode driveNode=null;
    for (File file:File.listRoots()) {
        driveNode = new DefaultMutableTreeNode(file.getAbsolutePath());
        //testLeaf(driveNode);          
        exploreDirectory(file, driveNode);
        root.add(driveNode);
    }

    displayTree();
}

Explorer2(String rootDirectory) {
    File file = new File(rootDirectory);
    DefaultMutableTreeNode directoryNode = new DefaultMutableTreeNode(file.getAbsolutePath());
    exploreDirectory(file, directoryNode);
    root.add(directoryNode);
    displayTree();
}

public void exploreDirectory (File dir, DefaultMutableTreeNode dirNode) {
    if (dir.isDirectory()) {
        //System.out.println(dir+" (parent) is a directory. Its level is : "+dirNode.getLevel());
        try {
            for (File file:dir.listFiles()) {
                DefaultMutableTreeNode fileNode = new DefaultMutableTreeNode(file.getAbsolutePath()); 

                dirNode.add(fileNode);
                //System.out.println(dirNode+" - "+file+" - Level = "+fileNode.getLevel());
                /*
                if (fileNode.getLevel()<limit) {
                    System.out.println(file+" (child) have a level : "+fileNode.getLevel());
                    exploreDirectory(file, fileNode);
                } else {
                    //System.out.println("Not in the loop : "+fileNode.getLevel());
                }
                */

            }

        } catch (NullPointerException e) {
            System.err.println(dir+" generates a NullPointerException");
        }           

    } else {
        System.out.println(dir+" is a file. Its level is : "+dirNode.getLevel());
    }
    countSubLevel+=1;
}

public void displayTree () {
    DefaultTreeModel treeModel = new DefaultTreeModel(root);
    tree = new JTree(treeModel);
    //tree = new JTree(root);
    tree.setRootVisible(true);
    tree.addTreeSelectionListener(new MyTreeSelectionListener());
    tree.addTreeExpansionListener(new MyTreeExpansionListener());


    this.setLayout(new BorderLayout());
    this.add(new JScrollPane(tree), BorderLayout.CENTER);
}

public void testLeaf(DefaultMutableTreeNode dir) {
    if (dir.isLeaf()) {
        System.out.println("Rien en dessous de "+dir);
    } else {
        System.out.println("Creuse !");
    }
}

class MyTreeSelectionListener implements TreeSelectionListener {
    @Override
    public void valueChanged(TreeSelectionEvent arg0) {
        if (tree.getLastSelectedPathComponent() != null) {
            File dir = new File(tree.getLastSelectedPathComponent().toString());
            DefaultMutableTreeNode dirNode = (DefaultMutableTreeNode) arg0.getPath().getLastPathComponent();
            DefaultMutableTreeNode fileNode=null;
            //System.out.println(dirNode.getChildCount());
            if (dirNode.getChildCount()==0) {
                System.out.println("The directory is : "+dir+" - Node : "+dirNode);
                exploreDirectory(dir, dirNode);
            }
        }

    }

}

class MyTreeExpansionListener implements TreeExpansionListener {

    @Override
    public void treeCollapsed(TreeExpansionEvent arg0) {
        System.out.println("Collapsed : "+arg0.getPath().getLastPathComponent());
    }

    @Override
    public void treeExpanded(TreeExpansionEvent arg0) {
        DefaultMutableTreeNode dir = (DefaultMutableTreeNode) arg0.getPath().getLastPathComponent();
        DefaultMutableTreeNode fileNode=null;
        System.out.println("Expanded directory is : "+dir+" - Number of child : "+dir.getChildCount());         
        for (int i=0 ; i<dir.getChildCount() ; i++) {

            File file = new File(dir.getChildAt(i).toString());
            fileNode = new DefaultMutableTreeNode(file.getAbsolutePath());
            exploreDirectory(file, fileNode);
            System.out.println("*"+i+" - directory is : "+dir+" - Files are : "+file+" - Number of children : "+fileNode.getChildCount());
        }           
    }       
}

public static void main(String[] args) {
    JFrame window = new JFrame ();
    window.setSize(500, 600);
    window.setTitle("Explorateur");
    window.setLocationRelativeTo(null);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setLayout(new BorderLayout());
    String str = System.getProperty("user.home");
    //Explorer2 explorer = new Explorer2(str);
    Explorer2 explorer = new Explorer2();

    window.getContentPane().add(explorer);
    window.setVisible(true);

}

}
导入java.awt.BorderLayout;
导入java.io.File;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.event.TreeExpansionEvent;
导入javax.swing.event.TreeExpansionListener;
导入javax.swing.event.TreeSelectionEvent;
导入javax.swing.event.TreeSelectionListener;
导入javax.swing.tree.DefaultMutableTreeNode;
导入javax.swing.tree.TreePath;
公共类探索者2扩展了JPanel{
私有JTree树;
私有DefaultMutableTreeNode根=新的DefaultMutableTreeNode();
int countSubLevel=0;
整数极限=1;
探险家2(){
DefaultMutableTreeNode驱动节点=null;
对于(文件:File.listRoots()){
driveNode=新的DefaultMutableTreeNode(file.getAbsolutePath());
//testLeaf(driveNode);
exploreDirectory(文件、驱动节点);
添加(驱动节点);
}
displayTree();
}
Explorer2(字符串根目录){
File File=新文件(根目录);
DefaultMutableTreeNode目录节点=新的DefaultMutableTreeNode(file.getAbsolutePath());
exploreDirectory(文件、目录节点);
添加(directoryNode);
displayTree();
}
public void exploreditory(文件目录,DefaultMutableTreeNode目录){
if(dir.isDirectory()){
//System.out.println(dir+“(parent)是一个目录,其级别为:“+dirNode.getLevel()”;
试一试{
对于(文件:dir.listFiles()){
DefaultMutableTreeNode fileNode=新的DefaultMutableTreeNode(file.getAbsolutePath());
添加(fileNode);
//System.out.println(dirNode+“-”+file+“-Level=“+fileNode.getLevel());
/*

if(fileNode.getLevel()您需要使用
TreeModel
类,例如
DefaultTreeModel
,作为树中节点的模型。它有方法让系统确定给定节点是否为叶,以及是否允许任何节点包含子节点或是否包含子节点(如您的情况)只有某些节点可以包含子节点


您的程序不使用自己的模型,因此
JTree
只创建自己的模型;因为它创建的模型无法判断节点是否是叶,除非它展开,否则它不知道它是带子节点的父节点,直到它展开,侦听器向其中添加节点。

您使用的是DefaultTreeModel wi对于DefaultMutableTreeNodes,他们无法知道给定节点是子树还是叶。请扩展DefaultMutableTreeNode并在eadh节点中放置对文件对象的引用,或者将文件对象放置在每个DefaultMutableTreeNode实例的setUserObject中。然后在DefaultTreeModel的扩展名中重写isLeaf,并检查文件对象t来确定它是否有子节点。Swing将调用此函数来确定如何显示该节点。