JTree实现windows文件打开

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;
	}

}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值