JTree學習實踐之類比資源管理員

來源:互聯網
上載者:User
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();}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.