树形资料夹,是一种显示模式,即採用SWT实现系统资料夹的树形结构显示,并读取资料夹目录下档案的大小(格式化显示)、实现选择资料夹、列印资料夹名、资料夹的绝对路径、显示选準的档案所在的路径,不显示隐藏档案路径。
基本介绍
- 中文名:树形资料夹
- 介绍:一种显示模式
- 採用:SWT
- 实现:系统资料夹的树形结构显示
简介
树形资料夹,是一种显示模式,即採用SWT实现系统资料夹的树形结构显示,并读取资料夹目录下档案的大小(格式化显示)、实现选择资料夹、列印资料夹名、资料夹的绝对路径、显示选準的档案所在的路径,不显示隐藏档案路径。
编程过程
*使用SWT实现的系统资料夹目录的显示,* * */
package test;
import java.io.File;
import java.text.NumberFormat;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.swt.SWT;
public class Treetest {
//类似资源管理器的树,其中包含滑鼠双击事件
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("系统资料夹目录的Tree显示");
shell.setLayout(new FillLayout(SWT.VERTICAL));
final Tree tree = new Tree(shell, SWT.BORDER);
TreeItem computer = new TreeItem(tree, SWT.NONE);
computer.setText("我的电脑");
Image computericon = new Image(shell.getDisplay(),
"icons//mycomputer.png");// 创建图像
computer.setImage(computericon);
//返回可获得的档案根目录,即本地档案系统结构的最顶层(如Windows平台上的盘符)
File[] roots = File.listRoots();
for (int i = 0; i < roots.length; i++) {
// TreeItem root = new TreeItem(tree, 0);
TreeItem root = new TreeItem(computer, 0);
root.setText(roots.toString());
root.setData(roots);//保存当前节点数据
Image cdicon = new Image(shell.getDisplay(), "icons//系统磁碟.png");// 创建磁碟图像
root.setImage(cdicon);
new TreeItem(root, 0);//把当前节点作为目录节点
}
tree.addListener(SWT.Expand, new Listener() {
public void handleEvent(final Event event) {
final TreeItem root = (TreeItem) event.item;
TreeItem[] items = root.getItems();
for (int i = 0; i < items.length; i++) {
if (items.getData() != null)
return;
items.dispose();
}
File file = (File) root.getData();
File[] files = file.listFiles();//返回File对象(资料夹或档案)的数组
//採用资料夹目录过滤器来判断当前路径是否为资料夹,返回File对象(资料夹)的数组
//File[] files = file.listFiles(new DirFilter());
// 列出该目录中的档案名称与资料夹名,返回一个档案名称数组
// String[] filespath=file.list();
// for (int i = 0; i < filespath.length; i++) {
// System.out.println("档案为: " + filespath);
// }
if (files == null)
return;
for (int i = 0; i < files.length; i++) {
//不显示隐藏档案的路径
//if(files.isHidden()==false){//判断当前路径的档案是否为隐藏档案
if ((files.isHidden() == false)
&& (files.isFile() == false)) {//判断当前路径是否为隐藏档案与资料夹
TreeItem item = new TreeItem(root, 0);
item.setText(files.getName());
//叶子节点对应的数值为相应资料夹的File对象
item.setData(files);
Image foldericon = new Image(shell.getDisplay(),
"icons//资料夹图示.png");// 创建资料夹图像
item.setImage(foldericon);
//当前为档案目录而不是档案的时候,添加新项目,以便只是显示资料夹(包括空资料夹),而不显示资料夹下的档案
if (files.isDirectory()) {
new TreeItem(item, 0);
}
}
}
}
});
// 滑鼠单击选择树的叶子节点事件
final Treetest tr = new Treetest();
tree.addListener(SWT.MouseDown, new Listener() {
public void handleEvent(Event event) {
Point point = new Point(event.x, event.y);
TreeItem item = tree.getItem(point);
if ((item != null) && (item.getData() != null)) {
System.out.println("您选中的资料夹名是:" + item.getText());
File s = (File) item.getData();
// 得到本地的预设格式
NumberFormat nf = NumberFormat.getInstance();
double fsizebyte = (double) tr.getDirectorySize(s);
System.out.println("您选中的资料夹大小是:" + nf.format(fsizebyte)
+ "位元组");
double fsizemb = (double) tr.getDirectorySize(s) / 1024;
System.out.println("您选中的资料夹大小是:" + nf.format(fsizemb)
+ "MB");
System.out.println("您选中的资料夹路径是:" + item.getData());
}
}
});
//根据Tree的大小更改shell的大小
Point size = tree.computeSize(300, SWT.DEFAULT);
int width = Math.max(300, size.x);
int height = Math.max(300, size.y);
shell.setSize(shell.computeSize(width, height));
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
/**
* 计算资料夹目录下档案的整体大小(单位为:位元组)
*/
public long getDirectorySize(File dir) {
long retSize = 0;//资料夹目录下档案的大小
if ((dir == null) || !dir.isDirectory()) {
return retSize;
}
File[] entries = dir.listFiles();
int count = entries.length;
for (int i = 0; i < count; i++) {
if (entries.isDirectory()) {
retSize += getDirectorySize(entries);
} else {
retSize += entries.length();
}
}
return retSize;
}
}