java swing jtree实现资源管理器 - 源码分享

时间:2018-11-14
本文章向大家介绍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 }