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