树结构显示文件路径

通过遍历文件夹,使用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 的文件系统信息。

在这个类中提供了大量的方法用于我们获得系统的资源这里写图片描述
就不举例了,具体的自己查

猜你喜欢

转载自blog.csdn.net/qq_37657081/article/details/78519395