簡介
樹形資料夾,是一種顯示模式,即採用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());
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;
}
}