// Here are some key codes for your issue.
/**
 * File FileNode.java
 * Date 2003-1-21
 * Time 15:31:21
 * 
 */
package org.jfml.gui.swing.resourcemanager;
import java.io.*;
import javax.swing.tree.*;
/*
 * FileNode类是DefaultMutableTreeNode的简单继承。
 * FileNode构造器将一个File对象制定为该TreeNode的用户对象(user object)。
 */
public class FileNode extends DefaultMutableTreeNode
{
private boolean explored = false; public FileNode(File file)
{
setUserObject(file);
}

/*
 * 覆盖了DefaultMutableTreeNode.getAllowsChildren()方法。
 * 如果FileNode代表的是目录,则允许有子节点。
 */
public boolean getAllowsChildren()
{
return isDirectory();
}

/*
 * 覆盖了DefaultMutableTreeNode.isLeaf()方法。
 * 如果FileNode代表的不是目录,那它就是一个叶子节点。
 */
public boolean isLeaf()
{
return !isDirectory();
}

public File getFile()
{
return (File)getUserObject();
} public boolean isExplored()
{
return explored;
} public boolean isDirectory()
{
File file = getFile();
return file.isDirectory();
}

/*
 * 覆盖了DefaultMutableTreeNode.toString()方法。
 * 返回路径的最后组件。
 */
public String toString()
{
File file = (File)getUserObject();
String filename = file.toString();
int index = filename.lastIndexOf(File.separator); return (index != -1 && index != filename.length() - 1)
? filename.substring(index + 1)
: filename;
}

public void explore()
{
if (!isDirectory())
{
return;
} if (!isExplored())
{
File file = getFile();
File[] children = file.listFiles(); for (int i = 0; i < children.length; ++i)
{
add(new FileNode(children[i]));
} explored = true;
}
}
}

解决方案 »

  1.   

    /**
     * File ResourceTree.java
     * Date 2003-1-21
     * Time 15:29:37
     * 
     */
    package org.jfml.gui.swing.resourcemanager;
    import java.io.*;
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.tree.*;
    public class ResourceTree extends JPanel
    {
      private final JTree kernelTree;
      private final JScrollPane kernelScrollPane;
      
      public ResourceTree(String drive)
      {
    kernelTree = new JTree(this.createTreeModel(drive));
    kernelScrollPane = new JScrollPane(kernelTree); this.setLayout(new BorderLayout());
    this.add(kernelScrollPane, BorderLayout.CENTER); kernelTree.addTreeSelectionListener
    (
    new TreeSelectionListener()
    {
    public void valueChanged(TreeSelectionEvent e)
    {
    TreePath path = e.getPath();
    Object[] objs = path.getPath();
      
      
    if(path != null)
    {
    System.out.println("Path: " + objs[objs.length -1].toString());
    }
    }
    }
    ); kernelTree.addTreeExpansionListener(new TreeExpansionListener()
    {
    public void treeCollapsed(TreeExpansionEvent e)
    {
    // do something
    }

    public void treeExpanded(TreeExpansionEvent e)
    {
    UpdateStatus us = new UpdateStatus(e);
    us.start();
    }

    class UpdateStatus extends Thread
    {
    private TreeExpansionEvent tee;

    UpdateStatus(TreeExpansionEvent e)
    {
    tee = e;
    }

    public void run()
    {
    System.out.println("Branch node is exploring......");
              
    SwingUtilities.invokeLater(new Runnable()
    {
    public void run()
    {
    TreePath path = tee.getPath();
    FileNode node = (FileNode)path.getLastPathComponent(); if (!node.isExplored())
    {
    DefaultTreeModel model = (DefaultTreeModel)kernelTree.getModel(); node.explore();

    model.nodeStructureChanged(node);
    }

    System.out.println("Branch node explored.");
    }
    });
    }
    }
    });
    }
      
    public ResourceTree()
    {
        this(null);
    } private DefaultTreeModel createTreeModel()
    {
        return createTreeModel(null);
    }

    private DefaultTreeModel createTreeModel(String drive)
    {
    if (null == drive)
    {
    drive = "C:\\";
    }    // 此处缺少字符串校验(正则表达式)

    File root = new File(drive);
    FileNode rootNode = new FileNode(root);

    rootNode.explore();

    return new DefaultTreeModel(rootNode);
    }
    }