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;
}
}
分享到:
相关推荐
使用JTree实现的文件资源管理器(仿照Windows操作系统)
java使用jtree动态实现二叉树,包含二叉树的插入删除很查找
jenkov-prizetags-3.4.0.jar,用于制作可以控制的树型菜单等功能,很好用,欢迎大家下载
一个关于用jaxp接口中的dom对xml文档进行提取分析修改的小程序,提供了树型目录显示xml文档内容。用于学习jaxp和java图形界面开发。有问题大家一起探讨哈!
JTree的使用 JTree的使用 JTree的使用
简单的实现树型列表。全部javascript代码。
用JSplitePane将窗口划分为左右两部分。单机左边菜单,在右边串口显示显示相关性息。相关功能可自行添加。
JTree2.0 目录树 树形菜单 菜单导航 经各浏览器测试。javascript脚本实现。
实现jTable和jTree的双向联动,点击jTree会选中jTable单元格,点击jTable会选中jTree节点。
jtree中加checkbox,实用哦。
jtree目录树,学习目录树的同学可以参考参考,js实现的,可以动态的无限添加目录树节点,非常方便
jtree和QQ项目\使用jmenu实现QQ的好友界面
java代码-使用java解决JTree文件浏览的源代码
NULL 博文链接:https://zengxx1989.iteye.com/blog/482883
JTree的用法
java课程实验,二叉树开发,swing,jtree实现图形界面,功能:二叉树的创建、查找、插入、删除
在java中,树对象提供了用树型结构分层显示数据的视图。可以扩展和收缩视图中的单个子树。树由Swing中的JTree类实现,JTree是Jcomponent的子类。文档就介绍了JTree的使用
上传一个简单java JTree Deno例子程序源代码,供初学者参考,也可以拿来当模块调用。很简单,重在于了解JTree如何编写!
JTree的例子,可以拖动节点 JTree的例子,可以拖动节点
java JTree+JTable使用样例,实现将JTree的节点内容显示到JTable中,eclipse导入maven项目 maven编译: mvn clean package