学习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)的更多相关文章

  1. 【Java】 实现一个简单文件浏览器(2)

    接着上篇文章 接下来说下程序右侧的文件内容表格如何实现 FileTable类: FileTable基础于JTable类,构造函数里用setDefaultRenderer设置每行默认的渲染器为FileT ...

  2. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  3. 使用 java 实现一个简单的 markdown 语法解析器

    1. 什么是 markdown Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的 ...

  4. Pyqt 一个简单的浏览器

    使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...

  5. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小

    原文:http://www.jb51.net/article/75002.htm 这篇文章主要介绍了使用Java编写一个简单的Web的监控系统的例子,并且将重要信息转为XML通过网页前端显示,非常之实 ...

  6. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  7. Android简单文件浏览器源代码 (转)

    Android简单文件浏览器源代码 (转) activity_main .xml <LinearLayout xmlns:android="http://schemas.android ...

  8. 使用JAVA写一个简单的日历

    JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateF ...

  9. Java实现一个简单的网络爬虫

    Java实现一个简单的网络爬虫 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWri ...

随机推荐

  1. [Drools]JAVA规则引擎 -- Drools

    Drools是一个基于Java的规则引擎,开源的,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效. 本文所使用的de ...

  2. 面向对象程序设计-C++_课时12访问限制

    private: 只有这个类(相同的类,不同的对象也可以)的成员函数可以访问这些成员变量或函数 public: 任何人都可以访问 protected: 只有这个类以及它的子子孙孙可以访问

  3. Java面试题之四

     十六.运行时异常与一般异常有何异同 Java提供了两类主要的异常:runtime exception和checked exception. 1.checked exception:这种异常也就是我们 ...

  4. php导出CSV时,超长数字精度丢失问题与前导0的字符串丢失0的问题解决

    php生成的CSV有时候会遇到两个特殊情况: 1.输出的字段中,含有超长数字(18位的数字)比方身份证:122121197410180016,就算输出时字段加上"",还是会被识别成 ...

  5. cmd命令 拷贝某文件夹及其子文件夹文件到其它文件夹

    @ECHO OFF cd/d %H:\FileLoc\CNET&cd.. ::echo 拷贝"%H:\FileLoc\CNET"中文件到"H:\FileLocTe ...

  6. React.js 是什么?

    在相当长的一段时间内,我很努力地去尝试理解 React 是什么以及它在应用架构上的健壮程度.这篇文章解答了我希望别人为我解答的疑惑. React 是什么? 和 Angular,Ember,Backbo ...

  7. Scala学习之for 循环和 yield 的例子

    for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合.Scala中for循环是有返回值的.如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是Lis ...

  8. 在CentOS 7 / Gnome 3 双屏时设置主屏

    在Windows中设置扩展显示器为主屏的方式非常清楚,但在Linux中就不是那么明显了,下面介绍如何完成这个设置 ------------------------------------------- ...

  9. svn添加强制注释,pre-commit结合python

    鉴于组内有些人在提交代码的时候并不写注释,而且没有固定格式,所以准备给svn提交时增加强制注释. 首先找到代码库里的hooks目录,正常建svn库的时候都有这个目录.进入hooks目录,找到pre-c ...

  10. C语言2

    函数是C语言的基本单位,类是java,c#,c++的基本单位 int abs(int x); double fabs(double x);   按变量的存储方式:静态变量.自动变量.寄存器变量 指针就 ...