轉】java 支援檔案刪除的樹狀檢視檔案總管

來源:互聯網
上載者:User
轉】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) {
        }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.