0.前言 最近老師佈置了一項用Java寫資源管理器的任務,一開始以為簡單,但是實際操作起來,卻發現網上的資源用起來相對生疏。在使用中,我也遇到了許多問題,雖然不能像其他博主一樣,寫的非常齊全,但我還是分享一下我寫的代碼。 1.準備知識 JTree是樹形結構,是我們做資源管理器的必要組件。其構造函數的 ...
0.前言
最近老師佈置了一項用Java寫資源管理器的任務,一開始以為簡單,但是實際操作起來,卻發現網上的資源用起來相對生疏。在使用中,我也遇到了許多問題,雖然不能像其他博主一樣,寫的非常齊全,但我還是分享一下我寫的代碼。
1.準備知識
- JTree是樹形結構,是我們做資源管理器的必要組件。其構造函數的參數可以是節點,或者模式。
- JTree只有放在JScrollPane里,才可以很好的顯示
- JTree是通過節點操作來實現多層目錄的。
- 一般使用DefaultMutableTreeNode來實現節點,可以通過add()函數,添加至其他節點。
2.思路
一開始的思路是用DFS深搜,但是實現後發現,相當的慢。
所以,我就想先寫一個“我的電腦”節點,然後往下加磁碟分區,然後當我點擊一個節點的時候(用事件監聽,這裡用到TreeSelectionListener),再往下展開(添加節點)
3.代碼
等我用空再添加,不要急啊。
4.全部代碼
目前只做到了顯示目錄,關於操作節點還未實現。
1 import java.awt.*; 2 import java.io.File; 3 4 import javax.swing.*; 5 import javax.swing.event.TreeExpansionEvent; 6 import javax.swing.event.TreeExpansionListener; 7 import javax.swing.event.TreeModelEvent; 8 import javax.swing.event.TreeModelListener; 9 import javax.swing.event.TreeSelectionEvent; 10 import javax.swing.event.TreeSelectionListener; 11 import javax.swing.tree.*; 12 13 public class Src_manage extends JFrame 14 implements TreeSelectionListener { 15 private JTree tree = new JTree(); 16 private DefaultTreeModel treeModel; 17 private DefaultMutableTreeNode top; 18 19 public Src_manage() { 20 this.setLayout(new BorderLayout()); 21 this.add(createPC(), BorderLayout.CENTER); 22 this.add(createPW(), BorderLayout.WEST); 23 //設置窗體 24 this.setSize(550, 450); 25 this.setVisible(true); 26 this.setTitle("資源管理器"); 27 this.setResizable(false); // 設置不允許縮放 28 setLocationRelativeTo(null); // 視窗居中 29 setDefaultCloseOperation(EXIT_ON_CLOSE);// 視窗點擊關閉時,退出程式 30 } 31 /** 32 * 設置左邊文件列表 33 * @return 34 */ 35 public JPanel createPW() { 36 JPanel pw = new JPanel(); 37 //設置模式 38 top = new DefaultMutableTreeNode("我的電腦"); 39 treeModel = new DefaultTreeModel(top); 40 //設置樹 41 tree = new JTree(treeModel); 42 tree.setEditable(true); 43 tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 44 tree.setShowsRootHandles(true); 45 //設置監聽 46 tree.addTreeSelectionListener(this); 47 //設置節點 48 File roots[] = File.listRoots(); 49 for(int i=0; i<roots.length; i++) { 50 top.add(new DefaultMutableTreeNode(roots[i])); 51 } 52 53 //添加至面板 54 JScrollPane jsp = new JScrollPane(tree); 55 jsp.setPreferredSize(new Dimension(200, 405)); 56 pw.add(jsp); 57 58 return pw; 59 } 60 /** 61 * 設置右邊文件顯示 62 * @return 63 */ 64 public JPanel createPC() { 65 JPanel pc = new JPanel(); 66 return pc; 67 } 68 /** 69 * 創建節點 70 * @return 71 */ 72 public void createNode(File path, DefaultMutableTreeNode node) { 73 File childs[] = path.listFiles(); 74 for(int i=0; i<childs.length; i++) { 75 if(childs[i].isHidden()) 76 continue; 77 DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(childs[i].getName()); 78 treeModel.insertNodeInto(tmp, node, node.getChildCount()); 79 if(childs[i].isDirectory()) 80 tmp.add(new DefaultMutableTreeNode()); 81 } 82 } 83 /** 84 * 主函數 85 * @param args 86 */ 87 public static void main(String[] args) { 88 // TODO 自動生成的方法存根 89 new Src_manage(); 90 } 91 92 @Override 93 public void valueChanged(TreeSelectionEvent e) { 94 // TODO 自動生成的方法存根 95 //獲取選擇的節點 96 DefaultMutableTreeNode node = (DefaultMutableTreeNode) (e.getPath().getLastPathComponent()); 97 //若為根節點,跳出 98 if(node.isRoot()) 99 return; 100 //獲取路徑 101 TreeNode[] tp = node.getPath(); 102 String path = tp[1].toString(); 103 for(int i=2; i<tp.length; i++) { 104 path += tp[i] + "\\"; 105 } 106 //增加節點 107 createNode( new File(path), node); 108 } 109 }