【Java】 实现一个简单文件浏览器(1)
学习Java的Swing的时候写的一个超简单文件浏览器
效果如图:

项目结构:

这里面主要用了两个控件,JTree和JTable
下面先说下左侧的文件树如何实现:
首先是FileTree类,继承于JTree类,这里实现了树节点展开,和鼠标移动事件响应
package FileTree;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.ExpandVetoException;
import javax.swing.tree.TreePath;
/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTree extends JTree {
	private static final long serialVersionUID = 1L;
	public TreePath mouseInPath;
    static protected FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    public FileTree() {
        setRootVisible(false);
        addTreeWillExpandListener(new TreeWillExpandListener(){
            @Override
            public void treeWillExpand(TreeExpansionEvent event) throws ExpandVetoException {
                FileTreeNode fileNode = (FileTreeNode)event.getPath().getLastPathComponent();
                if (!fileNode.isInit()){
                    File[] files;
                    if(fileNode.isDummyRoot()) {
                        files = fileSystemView.getRoots();
                    } else {
                        files = fileSystemView.getFiles(fileNode.getFile(), false);
                    }
                    for (int i = 0; i < files.length; i++){
                        if (files[i].isDirectory())
                        {
                            FileTreeNode childFileNode = new FileTreeNode(files[i]);
                            fileNode.add(childFileNode);
                        }
                    }
                }
                fileNode.setInit(true);
            }
            @Override
            public void treeWillCollapse(TreeExpansionEvent event) throws ExpandVetoException {
            }
        });
        addMouseMotionListener(new MouseAdapter() {
            @Override
            public void mouseMoved(MouseEvent e) {
                TreePath path = getPathForLocation(e.getX(), e.getY());
                if (path != null) {
                    if (mouseInPath != null) {
                        Rectangle oldRect = getPathBounds(mouseInPath);
                        mouseInPath = path;
                        repaint(getPathBounds(path).union(oldRect));
                    } else {
                        mouseInPath = path;
                    }
                } else if (mouseInPath != null) {
                    Rectangle oldRect =getPathBounds(mouseInPath);
                    mouseInPath = null;
                    repaint(oldRect);
                }
            }
        });
    }
}
FileTreeCellRenderer继承自DefaultTreeCellRenderer, 负责树节点显示渲染,这里主要是需要重载getTreeCellRendererComponent()方法
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus)
解释:配置基于传入组件的渲染器。使用 convertValueToText 向树传递消息,从而设置该值,最终对 value 调用 toString。基于选择设置前景色,基于 leaf 和 expanded 参数设置图标。
返回:渲染器用来绘制值的 Component
package FileTree;
import java.awt.Color;
import java.awt.Component;
import java.io.File;
import javax.swing.JLabel;
import javax.swing.JTree;
import javax.swing.plaf.ColorUIResource;
import javax.swing.tree.DefaultTreeCellRenderer;
/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTreeCellRenderer extends  DefaultTreeCellRenderer {
	private static final long serialVersionUID = 1L;
	public FileTreeCellRenderer(){
    }
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        FileTree fileTree = (FileTree) tree;
        FileTreeNode fileNode = (FileTreeNode) value;
        File file = (File) fileNode.getUserObject();
        JLabel label = (JLabel)super.getTreeCellRendererComponent(tree,value,selected,expanded,leaf,row,hasFocus);
        label.setText(fileNode.getFileName());
        label.setIcon(fileNode.getFileIcon());
        label.setOpaque(false);
        if (fileTree.mouseInPath != null &&
                fileTree.mouseInPath.getLastPathComponent().equals(value)) {
            label.setOpaque(true);
//            label.setBackground(new Color(255, 0, 0, 90));
            label.setBackground(Color.gray);
        }
        return label;
    }
    @Override
    public void setBackground(Color bg) {
        if (bg instanceof ColorUIResource){
            bg = null;
        }
        super.setBackground(bg);
    }
}
FileTreeNode继承DefaultMutableTreeNode类, 用于保存文件名和其他文件相关属性
package FileTree;
import java.io.File;
import javax.swing.Icon;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
/**
 * Created by Administrator on 2016/3/29.
 */
public class FileTreeNode extends DefaultMutableTreeNode {
	private static final long serialVersionUID = 1L;
	static FileSystemView fileSystemView = FileSystemView.getFileSystemView();
    private boolean isInit;
    private boolean isDummyRoot;
    private String fileName;
    private Icon fileIcon;
    public File getFile() {
        return file;
    }
    private File file;
    public FileTreeNode(File file){
        this(file, false, true);
    }
    public FileTreeNode(File file, boolean isDummyRoot){
        this(file,isDummyRoot, true);
    }
    public FileTreeNode(File file, boolean isDummyRoot, boolean allowsChildren){
        super(file, allowsChildren);
        this.file = file;
        this.fileName = fileSystemView.getSystemDisplayName(file);
        this.fileIcon = fileSystemView.getSystemIcon(file);
        this.isDummyRoot = isDummyRoot;
    }
    public boolean isInit() {
        return isInit;
    }
    public void setInit(boolean init) {
        isInit = init;
    }
    public boolean isDummyRoot() {
        return isDummyRoot;
    }
    public void setDummyRoot(boolean dummyRoot) {
        isDummyRoot = dummyRoot;
    }
    public String getFileName() {
        return fileName;
    }
    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public Icon getFileIcon() {
        return fileIcon;
    }
    public void setFileIcon(Icon fileIcon) {
        this.fileIcon = fileIcon;
    }
}
本文链接: http://www.bugcoding.com/entry/15
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
【Java】 实现一个简单文件浏览器(1)的更多相关文章
- 【Java】 实现一个简单文件浏览器(2)
		接着上篇文章 接下来说下程序右侧的文件内容表格如何实现 FileTable类: FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileT ... 
- Java实现一个简单的文件上传案例
		Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ... 
- 使用 java 实现一个简单的 markdown 语法解析器
		1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ... 
- Pyqt 一个简单的浏览器
		使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ... 
- 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
		原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ... 
- java:jsp: 一个简单的自定义标签 tld
		java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ... 
- Android简单文件浏览器源代码 (转)
		Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ... 
- 使用JAVA写一个简单的日历
		JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ... 
- Java实现一个简单的网络爬虫
		Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ... 
随机推荐
- BadgeView使用介绍
			前段时间做的一个淘宝客的项目,需要在商品图片上添加价格标签,之前自己使用TextView和Cavas绘制的感觉效果一般,今天偶然在CSDN上发现BadgeView这个开源项目,在git下载下来之后,使 ... 
- poj 1149 PIGS(最大流经典构图)
			题目描述:迈克在一个养猪场工作,养猪场里有M 个猪圈,每个猪圈都上了锁.由于迈克没有钥匙,所以他不能打开任何一个猪圈.要买猪的顾客一个接一个来到养猪场,每个顾客有一些猪圈的钥匙,而且他们要买一定数量的 ... 
- hdu - 1757 - A Simple Math Problem
			题意:当x < 10时, f(x) = x: 当x >= 10 时,f(x) = a0 * f(x-1) + a1 * f(x-2) + + a2 * f(x-3) + …… + a9 ... 
- Brew install for mac
			安装命令例如以下: curl -LsSf http://github.com/mxcl/homebrew/tarball/master | sudo tar xvz -C/usr/local --st ... 
- 使用weight属性实现视图的居中显示
			有的时候我们开发一个产品的时候需要让其中某个控件的宽度或高度占据其父容器的宽度或高度的一半显示,这个时候由于设备尺寸的限制,做到在每个设备上都具有同样的效果的话,我们就需要用到weightSum属性和 ... 
- JavaSE思维导图(三)
- sqlserver字符串拆分(split)方法汇总
			--方法0:动态SQL法declare @s varchar(100),@sql varchar(1000)set @s='1,2,3,4,5,6,7,8,9,10'set @sql='select ... 
- ORACLE恢复误删除的对象(表、存储过程等)
			1.恢复存储过程 原理就是利用了oracle里所有的存储过程的源代码都是存在dba_source里,而drop某个存储过程的时候,oracle这里肯定要去dba_source里把相关的源代码给dele ... 
- mysql innodb init function error
			150414 16:23:07 [ERROR] Plugin 'InnoDB' init function returned error. 150414 16:23:07 [ERROR] Plugin ... 
- Android 中Java和JavaScript交互入门
			如何实现JavaScript 和java 交互 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互 ... 
