package cn.zyf.java树1116;
import java.awt.Desktop;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class TreeTest extends JFrame {
public static void main(String args[]) {
TreeTest tt = new TreeTest();
tt.init();
}
// 初始化窗口
public void init() {
// 设置窗体大小
this.setSize(800, 600);
// 设置窗体居中
this.setLocationRelativeTo(null);
// 初始化一个树节点对象
TreeNode tn = this.createTree();
// 添加至JTree
final JTree jt = new JTree(tn);
// 添加监听器
jt.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 如果右键点击,则打开文件
if(e.getButton()==e.BUTTON3){
if (e.getClickCount() == 1) {
TreePath tp = jt.getClosestPathForLocation(e.getX(),
e.getY());
String s = "";
// 从1开始循环,忽略"计算机"
for (int i = 1; i < tp.getPath().length; i++) {
s += "/"+tp.getPath()[i];
}
try {
Desktop.getDesktop().open(new File(s));
} catch (Exception ef) {
javax.swing.JOptionPane.showMessageDialog(null,
"无法打开指定的文件");
}
}
}
}
});
// 创建一个滚动条对象
JScrollPane jsp = new JScrollPane(jt);
this.add(jsp);
// 设置窗体关闭
this.setDefaultCloseOperation(3);
// 设置窗体可见
this.setVisible(true);
}
// 得到节点
public DefaultMutableTreeNode createTree() {
File file[] = File.listRoots();
DefaultMutableTreeNode root = new DefaultMutableTreeNode("计算机");
for (int i = 0; i < file.length; i++) {
DefaultMutableTreeNode dtmn = new DefaultMutableTreeNode(file[i].getPath());
dtmn = createFile(dtmn, file[i]);
root.add(dtmn);
}
return root;
}
// 循环得到所有的文件
public static DefaultMutableTreeNode createFile(
DefaultMutableTreeNode root, File file) {
File fil[] = file.listFiles();
// 如果数组为空,不进行任何操作
if (null == fil) {
}
// 否则进行循环
else {
for (int i = 0; i < fil.length; i++) {
// 创建一个DefaultMutableTreeNode对象,并添加至root
DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(
fil[i].getName());
root.add(dmtn);
// 如果是目录,迭代
if (fil[i].isDirectory()) {
dmtn = createFile(dmtn, fil[i]);
}
// 否则,不进行任何操作
else if (fil[i].isFile()) {
}
}
}
return root;
}
}
以上是自己写的JTree搜索计算机上所有的文件并生成树,然后给JTree添加打开文件的监听方法,由于是一个一个文件的搜索,略感小慢,所以在接下来的代码中添加了线程(由于不大会用sleep方法,所以未添加,以至于跑起来的时候连我引以为傲的这台机子都卡了,CPU跑在95%以上),但是不知道为什么感觉速度是差不多,不知道是我没弄清楚线程的本质还是我的感觉有误~~~主要就是多加了一个MyThread类并把迭代的方法放进了线程的run()方法里。
package cn.zyf.java树1116;
import java.awt.Desktop;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class TreeTest extends JFrame {
public static void main(String args[]) {
TreeTest tt = new TreeTest();
tt.init();
}
// 初始化窗口
public void init() {
// 设置窗体大小
this.setSize(800, 600);
// 设置窗体居中
this.setLocationRelativeTo(null);
// 初始化一个树节点对象
TreeNode tn = this.createTree();
// 添加至JTree
final JTree jt = new JTree(tn);
// 添加监听器
jt.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
// 如果右键点击,则打开文件
if(e.getButton()==e.BUTTON3){
if (e.getClickCount() == 1) {
TreePath tp = jt.getClosestPathForLocation(e.getX(),
e.getY());
String s = "";
// 从1开始循环,忽略"计算机"
for (int i = 1; i < tp.getPath().length; i++) {
s += "/"+tp.getPath()[i];
}
try {
Desktop.getDesktop().open(new File(s));
} catch (Exception ef) {
javax.swing.JOptionPane.showMessageDialog(null,
"无法打开指定的文件");
}
}
}
}
});
// 创建一个滚动条对象
JScrollPane jsp = new JScrollPane(jt);
this.add(jsp);
// 设置窗体关闭
this.setDefaultCloseOperation(3);
// 设置窗体可见
this.setVisible(true);
}
// 得到节点
public DefaultMutableTreeNode createTree() {
File file[] = File.listRoots();
DefaultMutableTreeNode root = new DefaultMutableTreeNode("计算机");
for (int i = 0; i < file.length; i++) {
DefaultMutableTreeNode dtmn = new DefaultMutableTreeNode(file[i].getPath());
dtmn = createFile(dtmn, file[i]);
root.add(dtmn);
}
return root;
}
// 循环得到所有的文件
public static DefaultMutableTreeNode createFile(
DefaultMutableTreeNode root, File file) {
File fil[] = file.listFiles();
// 如果数组为空,不进行任何操作
if (null == fil) {
}
// 否则进行循环
else {
for (int i = 0; i < fil.length; i++) {
// 创建一个DefaultMutableTreeNode对象,并添加至root
DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(
fil[i].getName());
root.add(dmtn);
// 如果是目录,迭代
if (fil[i].isDirectory()) {
MyThread mt = new MyThread(dmtn,fil[i]);
mt.start();
}
// 否则,不进行任何操作
else if (fil[i].isFile()) {
}
}
}
return root;
}
/**
* 重写Thread线程
* @author z
* 每遇到一个目录创建一个线程,对其子文件进行搜索
*/
public static class MyThread extends Thread{
// 传入参数
public MyThread(DefaultMutableTreeNode dmtn,File file){
this.dmtn = dmtn;
this.file = file;
}
// 迭代的方法
public void run(){
dmtn = createFile(dmtn, file);
}
private DefaultMutableTreeNode dmtn;
private File file;
}
}