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();
}
}
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交