这几天忙别的了,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;

}

}

转载于:https://www.cnblogs.com/kentyshang/archive/2007/08/10/851041.html

java实现Windows资源管理器相关推荐

  1. 简单的Windows资源管理器——Java版本

    一直有很多小伙伴私信我要社团管理系统的源码,这个暂时无法分享,根据社团管理系统文章的思路完全是可以自己写出来的哦~ 最近一个小伙伴私聊我需要一个java小程序,现将之前写的一个Windows资源管理器 ...

  2. 计算机JAVA相关说课稿_七年级信息技术Windows资源管理器说课稿

    七年级信息技术Windows资源管理器说课稿 各位老师: 大家好!我说课的题目是<windows资源管理器>,本次课我将从教材及学情分析.教学方法设计.学法分析.教学过程以及教学反思五个方 ...

  3. 解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题

    解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题 参考文章: (1)解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题 (2)ht ...

  4. windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!!

    windows资源管理器对文件右键未响应!电脑小白求救[哭唧唧]!!! 右键文件直接转圈圈无响应! windows资源管理器 对任何文件和文件夹右键都未响应,文件可以拷出到U盘:桌面右键正常,文件双击 ...

  5. Windows资源管理器

    在资源管理器中,选定多个非连续文件的操作为( ). A.按住Shift键,单击每一个要选定的文件图标 B.按住Ctrl键,单击每一个要选定的文件图标 C.先选中第一个文件,按住Shift键,再单击最后 ...

  6. win10 桌面(Windows 资源管理器)卡死的根本解决办法

    自从换上 Win10,桌面就经常卡死,网上很多文章都建议在任务管理器里面重启 "Windows 资源管理器",但只不是根本办法,没办法上网查找了一大通,发现一个可能根本解决的办法, ...

  7. 为什么说jsp被替代了_您说什么:最喜欢的Windows资源管理器替代品

    为什么说jsp被替代了 Earlier this week we asked you to share your favorite alternatives to Window's native fi ...

  8. 干货分享:Windows资源管理器无限重启?解决方法竟然是…

    Windows资源管理器无限重启?Windows资源管理器无限重启教程 我们的电脑一个不留神,就很容易跑偏.程序有bug或是软件设计上有缺陷,会导致程序无限循环.在系统里有表现为Windows资源管理 ...

  9. windows 2008 r2 sharepoint 2007 文档库 在windows资源管理器打开问题

    1. 在Windows2008 r2服务器管理器中安装"桌面体验"功能,服务管理器->功能->添加功能->桌面体验(需要重启).然后,确保网络客户端服务是运行的. ...

最新文章

  1. 使用charles 抓取手机上的操作
  2. 一个cube的大小位置方向不断和另一个cube重合
  3. 求大佬帮Ansys三维地质体建模
  4. elcentro matlab,EL-Centro地震波积分计算与基线调整.docx
  5. 少林寺步入 5G 时代!
  6. AS星尘粒子系统 初识2
  7. 各软件官网下载地址合集
  8. php 快递单打印模板下载,电子面单 - 无需录单提供快递发货,接口返回html快递模板及单号 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  9. 全文检索四种技术解决方案
  10. C++试题 算法训练 相邻数对、画图
  11. 追风筝的人 第八章
  12. 数据库SQL实战(牛客网):获取员工其当前的薪水比其manager当前薪水还高的相关信息
  13. 资深程序员才能看懂的幽默时刻
  14. 计算机应用退修后多久知道结果,计算机核心论文投稿的一点碎碎念
  15. 百度地图测距 java_【java】改写js百度地图测距方法
  16. kube-scheduler
  17. 为什么现在深度学习才流行起来?
  18. linux打通任督二脉百度网盘,廖阅鹏催眠CD-催眠打通任督二脉
  19. 黑马程序员-JAVA.IO-字符集编码问题
  20. TMC2590-TA:步进驱控芯片

热门文章

  1. YunOS 对比 Android 两者究竟有何区别
  2. 工作进度总结汇报01
  3. Java JDBC连接SQL Server2005错误:通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败...
  4. ubuntu16.04上安装valgrind
  5. Windows批处理
  6. 第十四次ScrumMeeting博客
  7. JLINK通过SW模式下载程序的方法
  8. Mac电脑如何显示隐藏文件
  9. 轻量级web富文本框——wangEditor使用手册(2)——扩展一个“缩进”功能 demo
  10. 死锁产生的条件+排除死锁的方法