樹結構顯示文件路徑

通過遍歷文件夾,使用JTree控件就能夠實現這種功能

import java.awt.BorderLayout;


public class Demo extends JFrame implements TreeSelectionListener {

    private JPanel contentPane;
    JTree tree;
    DefaultMutableTreeNode root;//根節點

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Demo frame = new Demo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Demo() {

        initTree();
        this.add(tree);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
    }

    private void initTree() {
        // TODO Auto-generated method stub
        root=new DefaultMutableTreeNode("我的電腦");
         tree=new JTree(root);  
         tree.addTreeSelectionListener(this);
         File[] files=File.listRoots();
         for (File file:files) {
            DefaultMutableTreeNode obj=new DefaultMutableTreeNode(file);
            root.add(obj);
        }
    }

    @Override
    public void valueChanged(TreeSelectionEvent arg0) {
              TreePath treePath=arg0.getPath();
             DefaultMutableTreeNode defaultm= (DefaultMutableTreeNode) treePath.getLastPathComponent();
             //獲得節點對象
                File file=(File) defaultm.getUserObject();//獲得用戶對象,也就是文件
                if(!(file.isDirectory())){
                    return;
                }
                   File[] file2= file.listFiles();
             for(File file3:file2){//通過對文件的遍歷,我們實現文件查找的功能
                 DefaultMutableTreeNode dMutableTreeNode=new DefaultMutableTreeNode(file3);
                 //節點類型爲object,所以我們可以放文件在這裏
                 defaultm.add(dMutableTreeNode);
                 //我們將遍歷的節點放到父節點中
             }
    }

}

顯示效果比較差,因爲都是統一顯示,沒有圖標,所以我們還應該對文件進行判斷,使用圖標,這樣我們就應該使用TreeCellRenderer類來修改圖標,開始

import java.awt.BorderLayout;


public class Demo extends JFrame implements TreeSelectionListener {

    private JPanel contentPane;
    JTree tree;
    DefaultMutableTreeNode root;//根節點
    MyCellRenderer myCellRenderer;
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Demo frame = new Demo();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Demo() {

        initTree();

        JScrollPane scrollPane = new JScrollPane();
        tree=new JTree(root);   
        scrollPane .setViewportView(tree);
        tree.addTreeSelectionListener(this);
        tree.setCellRenderer(myCellRenderer);
        this.add(scrollPane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
    }

    private void initTree() {
        // TODO Auto-generated method stub
        root=new DefaultMutableTreeNode("我的電腦");
         myCellRenderer=new MyCellRenderer();
          initIcon();
         File[] files=File.listRoots();
         for (File file:files) {
            DefaultMutableTreeNode obj=new DefaultMutableTreeNode(file);
            root.add(obj);
        }
    }

    /**
     * 處理圖標
     */
    private void initIcon() {

    }

    @Override
    public void valueChanged(TreeSelectionEvent arg0) {
              TreePath treePath=arg0.getPath();
             DefaultMutableTreeNode defaultm= (DefaultMutableTreeNode) treePath.getLastPathComponent();
             //獲得節點對象
                File file=(File) defaultm.getUserObject();//獲得用戶對象,也就是文件
                if(!(file.isDirectory())){
                    return;
                }
                   File[] file2= file.listFiles();
             for(File file3:file2){//通過對文件的遍歷,我們實現文件查找的功能
                 DefaultMutableTreeNode dMutableTreeNode=new DefaultMutableTreeNode(file3);
                 //節點類型爲object,所以我們可以放文件在這裏
                 defaultm.add(dMutableTreeNode);
                 //我們將遍歷的節點放到父節點中
             }
    }

    class MyCellRenderer implements TreeCellRenderer{

        @Override
        public Component getTreeCellRendererComponent(JTree arg0, Object arg1,
                boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) {
            DefaultMutableTreeNode dNode=(DefaultMutableTreeNode) arg1;
                  Object object=dNode.getUserObject();
             if(!(object instanceof File)){
                 return new JLabel(object.toString());
             }
                File file=(File) dNode.getUserObject();
                FileSystemView view=FileSystemView.getFileSystemView();
                Icon icon = view.getSystemIcon(file);
                JLabel label = new JLabel("" + file, icon, JLabel.LEADING);
                label.setBackground(Color.CYAN);    
            return label;
        }
    }

}

這裏我們實現了TreeCellRenderer接口
需要注意的是,我們在這裏使用了FileSystemView類來獲得系統的圖標
爲了強化記憶,我們在這裏也學習下
FileSystemView 是 JFileChooser 的文件系統網關。由於 JDK1.1 File API 不允許對諸如根分區、文件類型信息或隱藏文件位之類的信息進行訪問,此類被設計成能夠直接獲得儘可能多的特定於 OS 的文件系統信息。

在這個類中提供了大量的方法用於我們獲得系統的資源這裏寫圖片描述
就不舉例了,具體的自己查

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章