`
zhuyifeng
  • 浏览: 44015 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

}

  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics