package per.hwf.tree;
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);
}
}
package per.hwf.tree;
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;
}
}
}
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);
}
}
package per.hwf.tree;
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;
}
}
}