JTree学习实践之模拟资源管理器

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

public class FileTree {

	JFrame jf = new JFrame("文件树");

	JComboBox combo;

	JTree tree;

	DefaultMutableTreeNode root;

	DefaultTreeModel model;

	public void init() {
		Vector<String> historyPath = new Vector<String>();
		historyPath.add("C:\\");
		historyPath.add("D:\\");
		historyPath.add("E:\\");
		historyPath.add("F:\\");
		JPanel panel = new JPanel();
		combo = new JComboBox(historyPath);
		combo.setEditable(true);
		Component[] components = combo.getComponents();
		System.out.println(components.length);
		for (int i = 0; i < components.length; i++) {
			components[i].addKeyListener(new KeyListener() {
				public void keyPressed(KeyEvent e) {
				}

				public void keyReleased(KeyEvent e) {
					if(e.getKeyCode() == KeyEvent.VK_ENTER){
						String path = combo.getEditor().getItem().toString();
						redrawTree(path);
					}
				}
				
				public void keyTyped(KeyEvent e) {
				}
			});
		}
		panel.setLayout(new BorderLayout());
		panel.add(combo);
		JButton btn = new JButton(">>");
		btn.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String path = combo.getSelectedItem().toString();
				redrawTree(path);
			}

		});
		panel.add(btn, BorderLayout.EAST);
		jf.add(panel, BorderLayout.NORTH);
		initTree();
		model = (DefaultTreeModel) tree.getModel();
		jf.add(new JScrollPane(tree));
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.pack();
		jf.setSize(600, 400);
		jf.setVisible(true);
	}

	/**
	 * 初始化
	 */
	private void initTree() {
		root = new DefaultMutableTreeNode("计算机");
		File[] file = File.listRoots();
		for (File f : file) {
			DefaultMutableTreeNode diskNode = new DefaultMutableTreeNode(f.getAbsolutePath());
			diskNode.add(new DefaultMutableTreeNode(null));
			root.add(diskNode);
		}
		tree = new JTree(root);
		tree.addTreeWillExpandListener(new TreeWillExpandListener() {
			public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
			}

			public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
				TreePath path = event.getPath();
				expandTree(path);
			}
		});

		tree.addTreeSelectionListener(new TreeSelectionListener() {
			public void valueChanged(TreeSelectionEvent e) {
				TreePath path = e.getNewLeadSelectionPath();
				expandTree(path);
			}
		});
	}
	
	/**
	 * 根据输入路径生成目录
	 * @param path
	 */
	private void redrawTree(String path) {
		/* 方法1 自个生成 */
		DefaultMutableTreeNode lastNode = showAllDirect("", root, path);
		TreeNode[] nodes = model.getPathToRoot(lastNode);
		TreePath tp = new TreePath(nodes);
		tree.scrollPathToVisible(tp);
		tree.updateUI();
		/* 方法2 利用Tree的TreeWillExpandListener调用相应方法生成(见注释方法‘showAllDirect(...)’) */
		//				showAllDirect(path, "", root);
	}
	
	//			private void showAllDirect(String path, String pre, DefaultMutableTreeNode parent) {
	//				DefaultMutableTreeNode selectedNode = null;
	//				pre = pre + (pre.endsWith("\\") || pre.equals("") ? "" : "\\");
	//				for (int i = 0; i < parent.getChildCount(); i++) {
	//					DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) parent.getChildAt(i);
	//					if (path.startsWith(pre + childNode.toString())) {
	//						selectedNode = childNode;
	//						break;
	//					}
	//				}
	//				if (selectedNode == null || selectedNode.getChildCount() == 0)
	//					return;
	//				DefaultMutableTreeNode newNode = (DefaultMutableTreeNode) selectedNode.getChildAt(0);
	//				TreeNode[] nodes = model.getPathToRoot(newNode);
	//				TreePath tp = new TreePath(nodes);
	//				tree.scrollPathToVisible(tp);
	//				tree.updateUI();
	//				if (!path.equals(selectedNode.toString())) {
	//					showAllDirect(path, pre + selectedNode.toString(), selectedNode);
	//				}
	//			}
	
	/**
	 * 根据路径生成目录
	 * @param file
	 * @param root
	 * @param path
	 * @return 目录最底层节点
	 */
	private DefaultMutableTreeNode showAllDirect(String fileName, DefaultMutableTreeNode root, String path) {
		DefaultMutableTreeNode returnNode = root;
		/* 已经生成下级目录 **/
		if (root.getChildCount() > 0 && ((DefaultMutableTreeNode) root.getChildAt(0)).getUserObject() != null) {
			String name = fileName;
			for (int i = 0; i < root.getChildCount(); i++) {
				DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) root.getChildAt(i);
				name = fileName + (fileName.equals("") || fileName.endsWith("\\") ? "" : "\\") + childNode;
				if (path.startsWith(name)) {
					returnNode = showAllDirect(name, childNode, path);
					break;
				}
				/* 找到所给路径的下一级节点 */
				else if (name.startsWith(path)) {
					returnNode = childNode;
					break;
				}
			}
		}
		/* 新生成下级目录 */
		else {
			File[] files = new File(fileName).listFiles();
			if (files == null)
				return root;
			root.removeAllChildren();
			for (File f : files) {
				DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(f.getName());
				if (f.isDirectory())
					childNode.add(new DefaultMutableTreeNode(null));
				root.add(childNode);
				if (path.startsWith(f.getAbsolutePath())) {
					returnNode = showAllDirect(f.getAbsolutePath(), childNode, path);
				}
				/* 找到所给路径的下一级节点 */
				else if (f.getAbsolutePath().startsWith(path)) {
					returnNode = childNode;
				}
			}
		}
		return returnNode;
	}

	/**
	 * 鼠标点击生成下级目录
	 * @param path
	 */
	private void expandTree(TreePath path) {
		if (path == null)
			return;
		String fileName = "";
		for (int i = 1; i < path.getPathCount(); i++) {
			String str = path.getPathComponent(i).toString();
			fileName += (str + (str.endsWith("\\") ? "" : "\\"));
		}
		combo.removeItemAt(0);
		combo.insertItemAt(fileName, 0);
		combo.setSelectedIndex(0);

		DefaultMutableTreeNode selNode = (DefaultMutableTreeNode) path.getLastPathComponent();
		/* 已经生成下级目录 **/
		if (selNode.getChildCount() > 0 && ((DefaultMutableTreeNode) selNode.getChildAt(0)).getUserObject() != null) {
			return;
		}
		if (selNode.isLeaf()) {
		}
		else {
			File[] files = new File(fileName).listFiles();
			if (files == null)
				return;
			selNode.removeAllChildren();
			for (File f : files) {
				DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(f.getName());
				if (f.isDirectory())
					childNode.add(new DefaultMutableTreeNode(null));
				selNode.add(childNode);
			}
		}
	}

	public static void main(String[] args) {
		new FileTree().init();
	}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值