轉】java 支援檔案刪除的樹狀檢視檔案總管
:
原文:http://www.xinbcw.com/viewthread.php?tid=2580
java代碼:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.ScrollPaneConstants;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeExpansionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
//測試類別
public class Exec {
public static void main(String[] args) {
// 建立表單類變數
DemoWindow dw = new DemoWindow("可以刪除檔案的樹狀檢視檔案總管");
// 將表單的寬度和高度分別設定為螢幕寬度和螢幕高度的1/2,左上方位置設定為螢幕寬度和螢幕高度的1/4處
Toolkit theKit = dw.getToolkit();
Dimension wndSize = theKit.getScreenSize();
dw.setBounds(wndSize.width / 4, wndSize.height / 4, wndSize.width / 2,
wndSize.height / 2);
// 點擊關閉按鈕可以退出程式
dw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 設定表單為可見
dw.setVisible(true);
}
}
// 介面表單
class DemoWindow extends JFrame implements TreeExpansionListener {
// 顯示目錄的樹狀檢視
JTree tree = null;
// 樹狀檢視的模型類
DefaultTreeModel dtm = null;
// 建構函式
public DemoWindow(String title) {
super(title);
// 設定預設的查看目錄
File f = new File("C:\\Program Files\\Java\\jdk1.6.0_10");
// 建立樹狀檢視的根節點
DefaultMutableTreeNode top = new DefaultMutableTreeNode(f.getPath());
// 設定樹狀檢視的初始狀態到樹狀檢視模型類
getRoot(top, f);
// 建立樹狀檢視模型類
dtm = new DefaultTreeModel(top);
// 設定樹狀檢視模型類為允許存在子節點,顯示加號標記
dtm.setAsksAllowsChildren(true);
// 建立樹狀檢視
tree = new JTree(dtm);
// 設定樹狀檢視的捲軸
int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;
int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;
JScrollPane jsp = new JScrollPane(tree, v, h);
// 添加樹狀檢視
add(jsp, BorderLayout.CENTER);
// 添加事件監聽器
tree.addTreeExpansionListener(this);
// 添加事件監聽器,響應右擊樹狀檢視顯示捷徑功能表
tree.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
// 如果為右擊
if (e.getButton() == MouseEvent.BUTTON3) {
// 利用點擊位置擷取所選擇的子節點
int selRow = tree.getRowForLocation(e.getX(), e.getY());
// 設定樹狀檢視的選中狀態
tree.setSelectionRow(selRow);
// 如果為有效子節點
if (selRow != -1) {
// 如果為右單擊
if (e.getClickCount() == 1) {
// 顯示捷徑功能表
JPopupMenu pop = new JPopupMenu();
JMenuItem item1 = new JMenuItem("刪除");
// 該捷徑功能表響應刪除檔案的操作
item1.addActionListener(new MenuAction());
pop.add(item1);
pop.show(tree, e.getX(), e.getY());
}
}
}
}
});
}
// 內部類,響應捷徑功能表的單擊操作
private class MenuAction implements ActionListener {
public void actionPerformed(ActionEvent e) {
// 得到樹狀檢視的被選擇節點路徑
TreePath tp = tree.getSelectionPath();
// 得到樹狀檢視的被選擇節點
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp
.getLastPathComponent();
// 從樹狀檢視刪除當前節點
DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel();
dtm.removeNodeFromParent(node);
// 得到被選擇節點對應檔案的完整路徑資訊
String fullPath = "";
for (Object obj : tp.getPath()) {
String str = obj.toString();
// 處理盤符根目錄問題
if (str.endsWith("\\"))
str = str.substring(0, str.length() - 1);
if (fullPath.equals(""))
fullPath += str;
else
fullPath += "\\" + str;
}
// 如果是檔案,直接刪除,如果是目錄則調用deleteDir函數刪除目錄
File currentFile = new File(fullPath);
if (currentFile.isFile())
currentFile.delete();
else
deleteDir(currentFile);
}
};
// 通過遞迴調用,可以刪除目錄的函數
public static boolean deleteDir(File dir) {
// 判斷是否為目錄,如果是,則遞迴調用自己,如果不是,直接刪除檔案
if (dir.isDirectory()) {
String[] subDir = dir.list();
for (String s : subDir) {
deleteDir(new File(dir, s));
}
}
return dir.delete();
}
// 該函數設定樹狀檢視的初始狀態到樹狀檢視模型類
public void getRoot(DefaultMutableTreeNode superDmtn, File f) {
// 遍曆所有下級檔案
File files[] = f.listFiles();
for (int i = 0; i < files.length; i++) {
// 建立樹狀檢視的子節點,名稱為檔案名稱
DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(files[i]
.getName());
// 如果是目錄,則對應的子節點允許存在子節點,顯示加號標記,否則不顯示
if (files[i].isDirectory())
dmtn.setAllowsChildren(true);
else
dmtn.setAllowsChildren(false);
// 將子節點加入上級節點
superDmtn.add(dmtn);
}
}
// 響應展開樹狀檢視
public void treeExpanded(TreeExpansionEvent event) {
// 得到當前展開的子節點
DefaultMutableTreeNode node = (DefaultMutableTreeNode) (event.getPath())
.getLastPathComponent();
// 判斷是否已有子節點,如果沒有,遍曆檔案資訊將其添加到當前子節點下,產生下級子節點
if (node.getChildCount() == 0) {
// 備份當前子節點
DefaultMutableTreeNode originalNode = node;
// 得到當前子節點的名,即對應檔案的名稱
String fileName = node.toString();
// 通過倒序上移節點,擷取節點對應檔案的完整路徑
while (node.getParent() != null) {
node = (DefaultMutableTreeNode) node.getParent();
fileName = node.toString() + "\\" + fileName;
}
// 繼續處理當前子節點
if (originalNode != null) {
// 產生當前子節點對應檔案的類變數
File f = new File(fileName);
// 如果是目錄,則繼續處理
if (f.isDirectory()) {
// 得到下級檔案清單
File files[] = f.listFiles();
// 如果目錄不為空白,迴圈遍曆每個下級檔案
if (files != null)
for (int i = 0; i < files.length; i++) {
// 建立下級子節點,名稱為檔案名稱
DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(
files[i].getName());
// 如果是目錄,則對應的子節點允許存在子節點,顯示加號標記,否則不顯示
if (files[i].isDirectory())
dmtn.setAllowsChildren(true);
else
dmtn.setAllowsChildren(false);
// 將建立的子節點追加到上級節點,作為最後一個節點
dtm.insertNodeInto(dmtn, originalNode, originalNode
.getChildCount());
}
}
}
}
}
// 響應收縮樹狀檢視
public void treeCollapsed(TreeExpansionEvent event) {
}
}