`

实现树目录功能演示(Tree)

阅读更多
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class TreeDemo extends JFrame {
	private static final long serialVersionUID = 1L;

	private DefaultTreeModel createTreeModel() { // 创建根结点, 只执行一次
		File root = new File("E:/");
		FileNode rootNode = new FileNode(root);

		rootNode.explore(); // 第一层结构显示
		return new DefaultTreeModel(rootNode);
	}

	public TreeDemo() {
		final JTree tree = new JTree(createTreeModel()); // 返回的是根结点
		// DefaultTreeModel
		JScrollPane l_scrollPane = new JScrollPane(tree);
		getContentPane().add(l_scrollPane, BorderLayout.WEST);

		final JTextArea textArea = new JTextArea(10, 10);
		JScrollPane r_scrollPane = new JScrollPane(textArea);
		getContentPane().add(r_scrollPane, BorderLayout.CENTER);

		// getContentPane().add(GJApp.getStatusArea(), BorderLayout.SOUTH);

		tree.addTreeExpansionListener(new TreeExpansionListener() { // 重写JTree的事件监听器
					public void treeCollapsed(TreeExpansionEvent e) {
					}

					public void treeExpanded(TreeExpansionEvent e) {
						TreePath path = e.getPath(); // 表示到某节点的一条路径 返回已被扩张 /
						// 折叠的值的路径
						FileNode node = (FileNode) path.getLastPathComponent(); // 文件路径
						// <-
						// (树)路径的最后一个组件

						if (!node.isExplored()) { // public boolean
							// isExplored() { return
							// explored; }
							// 该节点从未打开时为false
							DefaultTreeModel model = (DefaultTreeModel) tree
									.getModel(); // 返回提供数据的 TreeModel
							GJApp.updateStatus("exploring   ...");

							UpdateStatus us = new UpdateStatus();
							us.start();

							node.explore();
							model.nodeStructureChanged(node); // 当彻底改变节点的子节点和子节点的子节点...
							// 时调用该方法,这将导致记入一个
							// treeStructureChanged
							// 事件
						}

					}

					class UpdateStatus extends Thread {
						public void run() {
							try {
								Thread.sleep(450);
							} catch (InterruptedException e) {
							}

							SwingUtilities.invokeLater(new Runnable() {
								public void run() {
									GJApp.updateStatus("   ");
								}
							});
						}
					}
				});
	}

	public static void main(String args[]) {
		GJApp.launch(new TreeDemo(), "JTree   File   Explorer", 300, 300, 450,
				400);
	}
}

class FileNode extends DefaultMutableTreeNode {
	private static final long serialVersionUID = 1L;
	private boolean explored = false;

	public FileNode(File file) {
		setUserObject(file);
	}

	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 boolean getAllowsChildren() {
		return isDirectory();
	}

	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(); // 测试当前 File 对象表示的文件是否是一个路径, 还能展开
	}

	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;
			System.out.println("文件夹被第一次打开,   添加新节点时执行");
		}
	}
}

class GJApp extends WindowAdapter {
	static private JPanel statusArea = new JPanel();
	static private JLabel status = new JLabel("   ");

	public static void launch(final JFrame f, String title, final int x,
			final int y, final int w, int h) {
		f.setTitle(title);
		f.setBounds(x, y, w, h);
		f.setVisible(true);

		statusArea.setBorder(BorderFactory.createEtchedBorder());
		statusArea.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
		statusArea.add(status);
		status.setHorizontalAlignment(JLabel.LEFT);

		f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

		f.addWindowListener(new WindowAdapter() {
			public void windowClosed(WindowEvent e) {
				System.exit(0);
			}
		});
	}

	static public JPanel getStatusArea() {
		return statusArea;
	}

	static public void updateStatus(String s) {
		status.setText(s);
	}
}

 

分享到:
评论

相关推荐

    jQuery树插件演示族谱Family tree和日程安排

    在"jQuery树插件演示族谱Family tree"中,我们可以看到如何利用这些特性来呈现家庭成员间的亲缘关系。 二、构建族谱——Family Tree 1. 数据结构:首先,我们需要一个合适的数据结构来存储家族成员的信息,如姓名、...

    filetree以树形结构显示文件目录结构

    `filetree`的实现可能包括以下核心功能: 1. **遍历目录**:通过递归遍历文件系统,获取每个目录和文件的信息。 2. **构建树形数据结构**:将遍历到的目录和文件转换为树形数据结构,每个节点代表一个目录或文件,...

    树控件的演示

    在这个“树控件的演示”项目中,文件名“test”可能是一个示例数据库文件或包含代码示例的文件,用于展示如何实现上述功能。为了进一步学习和实践,你可以尝试打开这个文件,查看具体的代码实现,理解如何将数据库...

    B树的演示 MFC实现

    B树(Balanced Tree)是一种自平衡的树数据结构,它能够保持数据排序,并且在插入、删除和查找等操作时都能保持较高的效率。B树的主要特点是每个节点可以拥有多个子节点,这与二叉树(每个节点最多两个子节点)不同...

    树形js插件tree.js

    在网页开发中,数据的展示往往需要有层次结构,比如目录结构、组织架构等,这时候树形组件就显得尤为重要。Tree.js是一款优秀的JavaScript库,专门用于创建和管理树形结构,它以其强大的兼容性和可扩展性,成为...

    html树目录演示代码css+div+javascript

    最后,JavaScript负责实现树目录的交互功能。这里我们可以使用事件监听器来响应用户的点击操作,切换父节点的“open”类,从而控制子节点的显示和隐藏: ```javascript document.addEventListener('...

    jquery插件--表格树--GridTree(20091011更新版本)(过期)

    jQuery插件GridTree正是实现了这一功能,它为开发者提供了方便快捷的方式来构建表格树结构。 GridTree插件的最新更新(20091011版)主要集中在三个方面:样式完善、属性添加以及错误修复。这些改进提升了插件的用户...

    tabletree4J 树形菜单,无限级,有demo

    总的来说,tabletree4J是一个强大且灵活的工具,能够帮助开发者快速构建出功能完备、层次清晰的树形菜单,尤其适合处理具有无限级分类的场景。结合其提供的示例和API文档,开发者可以高效地将其集成到自己的项目中,...

    VC实现的树形控件演示程序

    在这个特定的案例中,"VC实现的树形控件演示程序"是一个利用MFC中的CTreeCtrl类创建的示例应用。CTreeCtrl是MFC对Windows API中的HTREEITEM控件的封装,它允许程序员在应用程序中实现类似Windows资源管理器的树状...

    jstree-实用的jQuery目录树插件

    通过以上内容,我们可以看出jstree是一个功能强大且灵活的jQuery插件,对于构建交互式目录树界面非常有帮助。无论是在网站导航、文件管理系统还是数据展示场景中,jstree都能提供出色的解决方案。

    bootstrap框架下带搜索功能的下拉树插件

    本文将详细讲解如何在Bootstrap环境下实现一个带有搜索功能的下拉树插件,并基于`bootstrap-select`和`bootstrap-treeview`两个库进行介绍。 首先,`bootstrap-select`是Bootstrap官方推荐的一个下拉菜单增强插件,...

    jquery.tree控件

    **jQuery Tree 控件详解** jQuery Tree控件是一种用于在网页上展示层次结构数据的JavaScript组件,它基于流行的jQuery库...无论是新手还是经验丰富的开发者,都能通过这个控件快速实现树形结构的展示,提升用户体验。

    [其他类别]JSP无限级分类目录树_sorttree.zip

    【标题】"JSP无限级分类目录树_sorttree.zip"是一个关于使用JSP技术实现无限级分类目录树的资源包。这个项目可能包含了源代码、示例和相关的文档,旨在帮助开发者了解和实现如何在Web应用中构建一个可以动态扩展的...

    Unity3D 编辑器行为树节点样例_BehaviorTree

    3. **样例脚本**:项目可能包含一些示例脚本,演示如何将行为树集成到游戏逻辑中。这些脚本会解释如何创建和运行行为树,以及如何根据游戏状态更新节点。 4. **资源文件**:可能会包含一些预设(Prefab)或场景...

    wpf datagrid实现树结构.rar

    总的来说,这个项目演示了如何通过自定义模板和数据绑定在WPF的DataGrid中实现树形结构,对于理解和应用此类功能非常有帮助。开发者需要了解MVVM设计模式、数据绑定、HierarchicalDataTemplate、以及如何处理UI事件...

    一个漂亮的目录树代码(JS版)

    这个“一个漂亮的目录树代码(JS版)”是一个JavaScript实现的目录树组件,它可以帮助开发者创建美观且交互性强的文件或目录结构。下面我们将深入探讨这个话题。 首先,目录树是一种以树形结构展示文件系统或逻辑...

    无极限可刷新js树 js tree

    - **dtree.js**:核心JavaScript文件,包含了js tree的所有功能和逻辑,是实现树形菜单功能的关键。 - **img**:图像文件夹,存放了菜单节点的图标和其他相关图片资源,用于增强视觉效果。 综合以上信息,js tree是...

    【ASP.NET编程知识】EasyUI Tree+Asp.net实现权限树或目录树导航的简单实例.docx

    总的来说,这个实例演示了如何在ASP.NET中利用EasyUI Tree组件创建权限树或目录树,并实现点击节点时的交互功能,以及用户登录状态的管理。通过这种方式,可以构建出直观且易于操作的后台管理系统界面。

    z-tree很好用的一个传统树

    2. `demo`目录:包含示例代码和演示,帮助开发者了解如何使用z-tree的各种功能。 3. `dist`目录:编译后的JavaScript文件,供项目直接引用。 4. `images`目录:存放与树相关的图标和其他图像资源。 5. `js`目录:...

    JSP无限级分类目录树-sorttree.zip

    这个名为"JSP无限级分类目录树_sorttree.zip"的压缩包很可能包含了一个示例项目,用于演示如何在JSP中实现无限级分类目录树。 首先,我们需要了解Java中的数据结构,特别是树形结构。在无限级分类目录中,每个分类...

Global site tag (gtag.js) - Google Analytics