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