JTree做的JFileTree

JFileTree提供四种构造方法:

1.JFileTree()

默认系统文件树,Desktop为根节点,子节点包括各个本地磁盘,以及Desktop下所有文件,文件叶节点可见。

2.JFileTree(boolean model)

model == JFilTree.DIRECTORY_AND_FILE

同1.

model == JFileTree.DIRECTORY_NO_FILE

默认系统文件树,只显示文件夹

3.JFileTree(File file)

以file为根节点的文件树。

4.JFileTree(File file, boolean model)

自定义模式。

/*

 * JFilTree.java

 */



import java.io.File;

import java.io.FileNotFoundException;

import java.util.concurrent.ExecutionException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.JTree;

import javax.swing.SwingWorker;

import javax.swing.event.TreeExpansionEvent;

import javax.swing.event.TreeExpansionListener;

import javax.swing.tree.DefaultMutableTreeNode;

import javax.swing.tree.DefaultTreeModel;

import javax.swing.tree.TreePath;



/**

 * 文件系统树

 * @author xiaoYu Email: yujia0525@gmail.com

 */

public class JFileTree extends JTree {

    

    public static final boolean DIRECTORY_AND_FILE = true;//含有文件节点

  public static final boolean DIRECTORY_NO_FILE = false;//不含有文件节点

  private static final String DESKTOP_EN = "Desktop";

    private static final String DESKTOP_ZH = "桌面";

    private static final String DISK_EN = "Disk";

    private JFileTreeNode systemNode = null;

    private JFileTreeNode rootNode;

    private DefaultTreeModel jFileTreeModel;

    private boolean model;//显示文件或不显示文件

    

  public JFileTree() throws FileNotFoundException {

        this(DIRECTORY_AND_FILE);

    }

    

    public JFileTree(boolean model) {

        this(null, model);        

    }

    

    public JFileTree(File file) {

        this(file, DIRECTORY_AND_FILE);

    }    

    

    public JFileTree(File file, boolean model) {

        this.model = model;

        putClientProperty("JTree.lineStyle", "Angled");

        //建立默认系统文件树 

        if (file == null || !file.exists()) {

            file = new File(System.getProperty("user.home") + File.separator + DESKTOP_EN);

            if (!file.exists()) {

                file = new File(System.getProperty("user.home") + File.separator + DESKTOP_ZH);

            }

            rootNode = systemNode = new JFileTreeNode(file);

        } else {

            rootNode = new JFileTreeNode(file);

        }

        rootNode.expand();

        jFileTreeModel = new DefaultTreeModel(rootNode);

        setModel(jFileTreeModel);

        addTreeExpansionListener(new JTreeExpansionListener());

    }

    

    public String getPathName(TreePath path) {

        Object o = path.getLastPathComponent();

        if (o instanceof JFileTreeNode) {

            return ((JFileTreeNode) o).file.getAbsolutePath();

        }

        return null;

    }

    

    /**

     * 文件树节点

     */

    protected class JFileTreeNode extends DefaultMutableTreeNode {

        

        protected File file;

        protected boolean isDirectory;

        

        public JFileTreeNode(File file) {

            this.file = file;

            isDirectory = file.isDirectory();

            setUserObject(file);

        }



        @Override

        public boolean isLeaf() {

            if (file == null) {

                return false;

            }

            return !isDirectory;

        }



        @Override

        public String toString() {

            if (file.getParentFile() == null) {

                return DISK_EN + "(" + file.getPath().substring(0, 2) + ")";

            } else {

                return file.getName();

            }

        }



        @Override

        public boolean getAllowsChildren() {

            return isDirectory;

        }

  

        /**

         * 节点展开

         * @return 展开是否含有子节点

         */

        public boolean expand() {

            this.removeAllChildren();

            if (this.equals(systemNode)) {

                File[] roots = File.listRoots();

                for (int i = 0; i < roots.length; i++) {

                    if (roots[i].exists()) {

                        this.add(new JFileTreeNode(roots[i]));

                    }

                }

            }

            File[] files = file.listFiles();

            if (files == null) {

                return false;

            }

            for (int i = 0; i < files.length; i++) {

                File f = files[i];

                /**

                 * 文件夹必添加

                 * 文件则受系统文件树model控制

                 */

                if (f.isDirectory() || model) {

                    this.add(new JFileTreeNode(f));

                }

            }

            return true;

        }

    }

    

    protected class JTreeExpansionListener implements TreeExpansionListener {



        public void treeExpanded(TreeExpansionEvent e) {

            JFileTreeNode fileNode = (JFileTreeNode) e.getPath().getLastPathComponent();

            if (fileNode != null) {

                new FileNodeExpansion(fileNode).execute();

            }            

        }



        public void treeCollapsed(TreeExpansionEvent e) {

        }

        

    }

    

    /**

     * 展开节点的后台线程

     */

    protected class FileNodeExpansion extends SwingWorker<Boolean, Void> {

        

        private JFileTreeNode node;

        

        public FileNodeExpansion(JFileTreeNode node) {

            this.node = node;

        }



        @Override

        protected Boolean doInBackground() throws Exception {

            return node.expand();

        }



        @Override

        protected void done() {

            try {

                //节点可以展开

                if (get()) {

                    jFileTreeModel.reload(node);

                }

            } catch (InterruptedException ex) {

                Logger.getLogger(JFileTree.class.getName()).log(Level.SEVERE, null, ex);

            } catch (ExecutionException ex) {

                Logger.getLogger(JFileTree.class.getName()).log(Level.SEVERE, null, ex);

            }

        }

    }



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值