`
Jony.Hwong
  • 浏览: 117243 次
  • 来自: ...
社区版块
存档分类
最新评论

java实现Windows资源管理器(JExplorer)

阅读更多
   程序仅仅实现了仿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;

    }

}
分享到:
评论
1 楼 fangfan 2010-03-15  
Jony HWong你好,我正在试验这段程序,这段程序有一个地方让我很不明白。
这里FileNode的构造函数中由FileSystemView提供默认的路径文件,是不是当执行FileTree当中的构造函数
setModel(new FileSystemModel(new FolderNode()));
之后整个树JTree就创建了吗?
整个创建树的过程中,只看到一层层的遍历磁盘文件,并把文件对象加在上层结点,并没有看到直接的AddNode
若没有创建树,那么在整个树的创建过程中,除了根节点,其他的结点怎么加上去的呢?

相关推荐

    jexplorer-3.6-windows-32_64-bit_jexplorer_

    《jExplorer:Java Swing中的网页嵌入神器》 在IT领域,尤其是在开发桌面应用程序时,有时我们...无论你是Java初学者还是经验丰富的开发者,jExplorer都能帮助你轻松实现网页浏览功能,提升你的应用程序的用户体验。

    JExplorer:用 java 为 linux 系统编写的类似鹦鹉螺的资源管理器

    如果你是开发者,你可以下载并研究其源代码,学习如何用 Java 实现一个资源管理器,或者根据自己的需求对其进行定制和扩展。对于非开发者用户,你可以自行编译安装这个项目,以体验这款由 Java 编写的 Linux 资源...

    功能强大的java资源管理器

    JExplorer.java可能是这个资源管理器的主要实现类,它可能包含了整个应用的主窗口、菜单栏、工具栏以及其他UI元素的设置。在这个类中,开发者可能会实例化JTree和JList,并将它们添加到适当的容器(如JScrollPane)...

    JExplorer.rar

    Java实现的资源管理器,通常被称为“文件浏览器”或“文件管理器”,是用于在操作系统中查看、管理和操作文件及目录的应用程序。在这个特定的例子中,"JExplorer.rar" 是一个压缩包,其中包含了使用Java Swing库开发...

    jExplorer_src_2007_12_19

    7. **设计模式**:作为一个复杂的软件项目,jExplorer可能会采用一些常见的设计模式,如单例模式(管理全局资源)、工厂模式(创建对象)、观察者模式(事件处理)等,以提高代码的可维护性和可扩展性。 8. **版本...

    用swt/jface实现的资源浏览器jExplorer

    有问题欢迎来信讨论: talent_marquis@163.com&lt;br&gt;&lt;br&gt;才搜索了一下,发现jExplorer这个名字已经泛滥了 &lt;br&gt;最核心代码来自IBM的JFace教程 链接如下: ... &lt;br&gt;已经实现的基本功能: &lt;br&gt;1....

    jExplorer——SWT做的一个文件浏览器

    1. 已实现简单的剪切/复制/粘贴功能(尚不能和外界程序交互) 2. 添加创建新文件夹功能 3. 添加选择全部/文件/文件夹功能 4. 增加对创建新文件夹,重命名,删除,粘贴操作的异常处理 5. FileUtil中增加...

    JExplorerTree:纯Java中的简单文件资源管理器组件

    JExplorer树 文件管理组件,具有基本操作和DnD支持 特征 它旨在用于特定项目目录(工作区)的上下文中。 它并非旨在完全浏览文件系统。 延迟加载(仅在扩展时) 没有额外的依赖关系(扩展JPanel并使用JTree) ...

    Java目录树控件

    为了实现这些高级特性,可能需要对JTree进行更复杂的定制或者使用第三方库,如JExplorer或JFileBrowser。 在"java实现系统目录树控件.txt"文档中,应该详细记录了实现这个功能的完整代码和可能遇到的问题及其解决...

    C4JExplorer:Eclipse 的 C4J-Explorer 插件-开源

    综上所述,C4JExplorer 插件是 Java 开发者实现契约设计和提升代码质量的有力工具。结合开源的 C4J 框架,它为开发者提供了一个完整的解决方案,以保证代码的正确性和健壮性,同时利用开源社区的力量持续改进和优化...

    [原创]用SWT/JFace实现的放大镜软件JZoomer(附源码)

    软件:JZoomer 版本:1.0 作者:Marquis Hou&lt;甜菜侯爵... JExplorer实现,初步了解JFace框架的设计思想,了解Action的使用方法 &lt;br&gt;20070730 1. ColorPicker实现,其中含有部分放大镜功能,但有内存溢出Bug

    [开源]用SWT/JFace实现的放大镜软件jZoomer v1.2.0(附源码)

    添加ColorInfoPanel用于显示和拾取颜色 ·在ColorAction添加ColorInfoPanel相关的资源、逻辑和方法 ·添加TrackerAction用以实现对图片大小的测量(未实现) 4. 版本变更: 版本升级为1.1 5. 待做...

    【重大更新】用SWT/JFace实现的放大镜JZoomer V1.1.1(附源码)

    在ColorAction添加ColorInfoPanel相关的资源、逻辑和方法 ·添加TrackerAction用以实现对图片大小的测量(未实现) 4. 版本变更: 版本升级为1.1 5. 待做事项: ·停止监控时图片的缩放 ·...

Global site tag (gtag.js) - Google Analytics