java实现Windows资源管理器

简介:
这几天忙别的了,StatusBar存在的问题没来得及解决,也没出新东西。只好贴一个以前的作品救救场。
 
程序仅仅实现了仿Windows资源管理器的本地文件的浏览功能,不能通过“网上邻居”浏览邻近的电脑,另外,“控制面板”和“垃圾箱”也没能列出来。
程序包括3个文件,分别是JExplorer.java、FileTree.java和FileList.java。可以在网页中tl.exercise.swing文件夹中找到。其中FileTree.java中定义了一个用来显示Windows文件夹的树;顾名思义FileList.java中定义的是列表,不够这个列表很简单;main函数在JExplorer.java里面。
 
树的实现其实很简单,主要使用了两个技术:
1.     使用javax.swing.filechooser.FileSystemView列举系统文件夹,获得系统图标。
2.   使用javax.swing.tree.DefaultTreeCellRenderer改变Node的图标。
===================================================================

// FileTree.java

/***********************************************************

 *    Author: Jason

 *     email: tl21cen@hotmail.com

 * CSDN blog: http://blog.csdn.net/UnAgain/

 ***********************************************************/

package tl.exercise.swing;

 

import java.awt.Component;

import java.io.File;

import java.util.Vector;

 

import javax.swing.Icon;

import javax.swing.JTree;

import javax.swing.event.TreeExpansionEvent;

import javax.swing.event.TreeExpansionListener;

import javax.swing.event.TreeModelListener;

import javax.swing.event.TreeSelectionEvent;

import javax.swing.event.TreeSelectionListener;

import javax.swing.filechooser.FileSystemView;

import javax.swing.tree.DefaultTreeCellRenderer;

import javax.swing.tree.TreeModel;

import javax.swing.tree.TreePath;

 

public class FileTree extends JTree {

    static final long serialVersionUID = 0;

 

    private FileList theList;

 

    public FileTree(FileList list) {

        theList = list;

        setModel(new FileSystemModel(new FolderNode()));

        this.setCellRenderer(new FolderRenderer());

      

        addTreeSelectionListener(new TreeSelectionListener() {

           public void valueChanged(TreeSelectionEvent tse) {

           }

       });

      

        this.setSelectionRow(0);

    }

 

    public void fireValueChanged(TreeSelectionEvent tse) {

        TreePath tp = tse.getNewLeadSelectionPath();

        Object o = tp.getLastPathComponent();

       // theList.fireTreeSelectionChanged((PathNode)o);

        theList.fireTreeSelectionChanged((FolderNode) o);

    }

 

    public void fireTreeCollapsed(TreePath path) {

        super.fireTreeCollapsed(path);

        TreePath curpath = getSelectionPath();

 

       if (path.isDescendant(curpath)) {

           setSelectionPath(path);

       }

    }

 

    public void fireTreeWillExpand(TreePath path) {

        System.out.println("Path will expand is " + path);

    }

 

    public void fireTreeWillCollapse(TreePath path) {

        System.out.println("Path will collapse is " + path);

    }

 

    class ExpansionListener implements TreeExpansionListener {

        FileTree tree;

 

        public ExpansionListener(FileTree ft) {

           tree = ft;

       }

 

        public void treeCollapsed(TreeExpansionEvent tee) {

       }

 

        public void treeExpanded(TreeExpansionEvent tee) {

       }

    }

}

 

class FileSystemModel implements TreeModel {

    I_fileSystem theRoot;

 

    char fileType = I_fileSystem.DIRECTORY;

 

    public FileSystemModel(I_fileSystem fs) {

        theRoot = fs;

    }

 

    public Object getRoot() {

        return theRoot;

    }

 

    public Object getChild(Object parent, int index) {

        return ((I_fileSystem) parent).getChild(fileType, index);

 

    }

 

    public int getChildCount(Object parent) {

        return ((I_fileSystem) parent).getChildCount(fileType);

    }

 

    public boolean isLeaf(Object node) {

        return ((I_fileSystem) node).isLeaf(fileType);

    }

 

    public int getIndexOfChild(Object parent, Object child) {

        return ((I_fileSystem) parent).getIndexOfChild(fileType, child);

    }

 

    public void valueForPathChanged(TreePath path, Object newValue) {

    }

 

    public void addTreeModelListener(TreeModelListener l) {

    }

 

    public void removeTreeModelListener(TreeModelListener l) {

    }

}

 

interface I_fileSystem {

    final public static char DIRECTORY = 'D';

 

    final public static char FILE = 'F';

 

    final public static char ALL = 'A';

 

    public Icon getIcon();

 

    public I_fileSystem getChild(char fileType, int index);

 

    public int getChildCount(char fileType);

 

    public boolean isLeaf(char fileType);

 

    public int getIndexOfChild(char fileType, Object child);

}

 

/**

 * A data model for a JTree. This model explorer windows file system directly.

 *

 * <p>

 * Perhaps there is a fatal bug with this design. For speed, each of instances

 * of this model contains file objects of subdirectory, up to now, there isn't

 * any method to release them until program be end. I'm afraid that the memory

 * would be full of if the file system is large enough and JVM memery size

 * setted too small.

 *

 * <p>

 * I won't pay more attention to solve it. it isn't goal of current a exercise.

 *

 * @author Jason

 */

class FolderNode implements I_fileSystem {

 

    // private static FolderNode theRoot;

    private static FileSystemView fsView;

 

    private static boolean showHiden = true;;

 

    private File theFile;

 

    private Vector<File> all = new Vector<File>();

 

    private Vector<File> folder = new Vector<File>();

 

    /**

     * set that whether apply hiden file.

     *

     * @param ifshow

     */

    public void setShowHiden(boolean ifshow) {

        showHiden = ifshow;

    }

 

    public Icon getIcon() {

        return fsView.getSystemIcon(theFile);

    }

 

    public String toString() {

       // return fsView.

        return fsView.getSystemDisplayName(theFile);

    }

 

    /**

     * create a root node. by default, it should be the DeskTop in window file

     * system.

     *

     */

    public FolderNode() {

        fsView = FileSystemView.getFileSystemView();

        theFile = fsView.getHomeDirectory();

        prepareChildren();

    }

 

    private void prepareChildren() {

      File[] files = fsView.getFiles(theFile, showHiden);

 

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

           all.add(files[i]);

           if (files[i].isDirectory()

                   && !files[i].toString().toLowerCase().endsWith(".lnk")) {

 

               folder.add(files[i]);

           }

       }

    }

 

    private FolderNode(File file) {

        theFile = file;

        prepareChildren();

    }

 

    public FolderNode getChild(char fileType, int index) {

       if (I_fileSystem.DIRECTORY == fileType) {

           return new FolderNode(folder.get(index));

       } else if (I_fileSystem.ALL == fileType) {

           return new FolderNode(all.get(index));

       } else if (I_fileSystem.FILE == fileType) {

           return null;

       } else {

           return null;

       }

 

    }

 

    public int getChildCount(char fileType) {

       if (I_fileSystem.DIRECTORY == fileType) {

           return folder.size();

       } else if (I_fileSystem.ALL == fileType) {

           return all.size();

       } else if (I_fileSystem.FILE == fileType) {

           return -1;

       } else {

           return -1;

       }

    }

 

    public boolean isLeaf(char fileType) {

       if (I_fileSystem.DIRECTORY == fileType) {

           return folder.size() == 0;

       } else if (I_fileSystem.ALL == fileType) {

           return all.size() == 0;

       } else if (I_fileSystem.FILE == fileType) {

           return true;

       } else {

           return true;

       }

    }

 

    public int getIndexOfChild(char fileType, Object child) {

       if (child instanceof FolderNode) {

           if (I_fileSystem.DIRECTORY == fileType) {

               return folder.indexOf(((FolderNode) child).theFile);

           } else if (I_fileSystem.ALL == fileType) {

               return all.indexOf(((FolderNode) child).theFile);

           } else if (I_fileSystem.FILE == fileType) {

               return -1;

           } else {

               return -1;

           }

       } else {

           return -1;

       }

    }

}

 

class FolderRenderer extends DefaultTreeCellRenderer {

    private static final long serialVersionUID = 1L;

    public Component getTreeCellRendererComponent(JTree tree, Object value,

           boolean sel, boolean expanded, boolean leaf, int row,

           boolean hasFocus) {

 

        I_fileSystem node = (I_fileSystem) value;

       Icon icon = node.getIcon();

 

        setLeafIcon(icon);

        setOpenIcon(icon);

        setClosedIcon(icon);

 

        return super.getTreeCellRendererComponent(tree, value, sel, expanded,

              leaf, row, hasFocus);

    }

}


=========================================================
// JExplorer.java

package tl.exercise.swing;

 

import java.awt.BorderLayout;

import java.awt.Dimension;

import java.awt.Toolkit;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JSplitPane;

import javax.swing.border.BevelBorder;

 

public class JExplorer {

    public static void main(String[] args) {

        //JFrame.setDefaultLookAndFeelDecorated(true);

        JFrame frame = new JFrame();

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

        frame.getContentPane().add(new UI(frame));

 

        frame.pack();

 

        Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();

       int left = (screen.width - frame.getWidth()) / 2;

       int top = (screen.height - frame.getHeight()) / 2;

 

        frame.setLocation(left, top);

 

        frame.setVisible(true);

    }

}

 

class UI extends JPanel {

    //implements I_menuHandler{

    static final long serialVersionUID = 0l;

 

    static int LEFT_WIDTH = 200;

 

    static int RIGHT_WIDTH = 300;

 

    static int WINDOW_HEIGHT = 300;

 

    JFrame frame = null;

 

    public UI(JFrame frame) {

        //EmptyBorder eb = new EmptyBorder(1,1,1,1);

 

        this.frame = frame;

        setPreferredSize(new Dimension(800, 600));

 

        setBorder(new BevelBorder(BevelBorder.LOWERED));

 

        setLayout(new BorderLayout());

 

        FileList list = new FileList();

        FileTree tree = new FileTree(list);

        tree.setDoubleBuffered(true);

        list.setDoubleBuffered(true);

 

        JScrollPane treeView = new JScrollPane(tree);

        treeView.setPreferredSize(

new Dimension(LEFT_WIDTH, WINDOW_HEIGHT));

        JScrollPane listView = new JScrollPane(list);

        listView.setPreferredSize(

new Dimension(RIGHT_WIDTH, WINDOW_HEIGHT));

 

        JSplitPane pane =

new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, treeView,

               listView);

        pane.setDividerLocation(300);

        pane.setDividerSize(4);

        //pane.setDoubleBuffered(true);

 

        add(pane);

    }

}


==========================================================
// FileList.java

package tl.exercise.swing; 

import java.awt.Color;

import java.awt.Component;

import javax.swing.JLabel;

import javax.swing.JList;

import javax.swing.ListCellRenderer;

import javax.swing.ListModel;

import javax.swing.event.ListDataListener;

 

public class FileList

extends JList{

    //PathNode theNode;

    FileListModel dataModel;

    static final long serialVersionUID = 10;

     public FileList() {

        dataModel = new FileListModel();

        setModel(dataModel);

        this.setCellRenderer(new MyCellRenderer());

    }

    public void fireTreeSelectionChanged(I_fileSystem node) {

        //Vector files = node.getFiles();

        //theNode = node;

        dataModel.setNode(node);

        updateUI();

    }

}

 

class FileListModel

implements ListModel {

    FileList theList;

    I_fileSystem node;

    char fileType = I_fileSystem.ALL;

 

    public void setNode (I_fileSystem node) {

        this.node = node;

    }

 

    public Object getElementAt(int index) {

       if (node != null) {

           return ((I_fileSystem)node).getChild(fileType, index);

       } else {

           return null;

       }

    }

 

    public int getSize() {

       if (node != null) {

           return ((I_fileSystem)node).getChildCount(fileType);

       } else {

           return 0;

       }      

    }

   

    public void addListDataListener(ListDataListener l) {

    }

    public void removeListDataListener(ListDataListener l) {

    }

}

 

class MyCellRenderer extends JLabel implements ListCellRenderer {

    public MyCellRenderer() {

        setOpaque(true);

    }

    public Component getListCellRendererComponent(

        JList list,

        Object value,

        int index,

        boolean isSelected,

        boolean cellHasFocus)

    {

        FolderNode node = (FolderNode)value;

        setIcon(node.getIcon());

        setText(value.toString());

        setBackground(isSelected ? Color.BLUE.darker().darker(): Color.WHITE);

        setForeground(isSelected ? Color.WHITE : Color.BLACK);

        return this;

    }

}

本文转自kenty博客园博客,原文链接http://www.cnblogs.com/kentyshang/archive/2007/08/10/851041.html如需转载请自行联系原作者


kenty

相关文章
|
1月前
|
Java Unix 应用服务中间件
使用java service wrapper把windows flume做成服务
使用java service wrapper把windows flume做成服务
|
1月前
|
Java 关系型数据库 MySQL
Windows用Tomcat发布Java项目
对于云服务器,程序员一般不会陌生,如果项目需要发布到现网,那么服务器是必不可缺的一项硬性条件,那么如何在云服务器上部署一个项目,需要做哪些配置准备,下面就由本文档为大家讲解,本篇以Tomcat服务器发布J2EE项目为例。
62 0
Windows用Tomcat发布Java项目
|
1月前
|
存储 Java Windows
Java21 JDK下载安装及Windows环境变量配置
JDK是Java的开发工具包,要进行Java学习或开发之前,需先下载安装,下载地址如下:提示:这网址里面有三个扩展名的文件,分别是“.zip”、“.exe”和“.msi”,鄙人选择的是.exe的文件,下方的安装和环境的配置也是安装该文件的安装程序进行的。
490 2
|
1月前
|
Java Windows
windows下 安装 Elasticsearch报错warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
windows下 安装 Elasticsearch报错warning: usage of JAVA_HOME is deprecated, use ES_JAVA_HOME
113 0
|
1月前
|
Java Linux Windows
java在Linux执行命令Java在Windows执行命令
java在Linux执行命令Java在Windows执行命令
23 0
|
11天前
|
Java Windows
windows系统bat批处理 一键配置java jdk环境变量
windows系统bat批处理 一键配置java jdk环境变量
|
12天前
|
Oracle Java 关系型数据库
02. 【Java教程】Windows 上安装 Java
02. 【Java教程】Windows 上安装 Java
13 1
|
1月前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
525 1
|
1月前
|
JavaScript Java 测试技术
基于Java的游戏资源管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的游戏资源管理系统的设计与实现(源码+lw+部署文档+讲解等)
27 0
|
1月前
|
存储 Oracle Java
windows配置java环境
windows配置java环境
55 0