【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 ...
随机推荐
- Android 获取屏幕分辨率
原文:Android 获取屏幕分辨率 得到一个屏幕尺寸的三种方法如下: // 通过WindowManager获取 DisplayMetrics dm = new Displ ...
- 米兰站热卖:奢侈品电商困局已破?-搜狐IT
米兰站热卖:奢侈品电商困局已破?-搜狐IT 米兰站热卖:奢侈品电商困局已破?
- swift3.0 构造器、析构方法(3)
构造和析构是两种特殊的方法,在对象进行初始化的时候 使用构造,在对象的释放操作中,使用析构. 构造器的定义: init (){ //代码 } init(name:String){ //代码 } 在构造 ...
- 从ACM中删除一个已经创建的Library
从ACM中删除一个已经创建的Library,无法通过界面操作,须要手工从DB中删除.须要删除的表记录有: RECENTUPDATE 找到字段Name等于该libraryName的那条记录删除掉 del ...
- CF Codeforces Round #258 (Div. 2) B (451B)
题意:找出一段逆序! 预存a[]数组到b[]数组.将b排序,然后前后找不同找到区间[l,r],然后推断[l,r]是否逆序就能够了!.当然还得特判本身就是顺序的!! ! AC代码例如以下: #inclu ...
- 一个简单的游标删除SQL SERVER表
use databaseName declare @tblname char(100) declare @sql char(5000) declare table_cursor cursor for ...
- VBA 开发学习--基础语法2
VBA中的运算符 算数运算符及其作用 + 求两个数的和 - 求两个数的差:求一个数的相反数 * 求两个数的积 / 求两个数的商(保留小数位 5/2=2.5) \ 整除 (保留整数位 ...
- javascript 工作必知(四) 类型转换
string和number boolean javascript 类型会根据赋值的进行转成相应的类型. var str = ""; alert(typeof (str));//st ...
- <学习>.NET的反射基础
关键词 Assembly 使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例. Module 通过它可以获取包含模块的程序集以及模块中的类等, ...
- pl/sql developer 编码格式设置(转)
一.pl/sql developer 中文字段显示乱码 原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二.查看和修改oracle数据库字符集: select ...