sunfruit[請訪問http://www.fruitres.cn]

          --我相信JAVA能走得更遠 QQ:316228067

          [原創]JAVA編寫的帶有復選框的資源管理器樹目錄

              --sunfruit

              用JAVA實現了帶有復選框的樹目錄


              JDK版本
                  JDK1.4.x
              功能
                  實現了帶有復選框的資源管理器樹目錄,還有需要改進的地方,我在以后更新,如果那位朋友有好的建議歡迎提出
             
              歡迎大家提意見,交流
             
              代碼如下
             
          import javax.swing.tree.*;
          import javax.swing.filechooser.*;
          import javax.swing.event.*;
          import java.awt.Cursor;
          import java.awt.Component;
          import java.awt.Font;
          import java.io.*;
          import java.awt.*;
          import javax.swing.*;
          import java.util.*;
          import java.awt.event.MouseListener;
          import java.awt.event.MouseEvent;

          /**
           * Title: 系統級樹目錄
           * Description: 
           * Copyright: Copyright (c) 2004
           * Company: 
           * @author cuijiang contact cj0063@sina.com or cuij7718@yahoo.com.cn
           * @version 1.0
           */
          public class AgileSuperJTreeBasic
              extends JTree
              implements TreeExpansionListener, TreeSelectionListener, MouseListener {
            protected DefaultTreeModel treeModel;
            protected FileSystemView fileSystemView; //建立文件系統視類對象
            protected FileNode root;

            public AgileSuperJTreeBasic() {
              Font myFont = new Font("宋體", 11, 12);
              fileSystemView = FileSystemView.getFileSystemView();
              root = new FileNode(fileSystemView.getRoots()[0]);
              root.explore();
              treeModel = new DefaultTreeModel(root);
              this.setModel(treeModel); //設定樹形菜單
              this.addTreeExpansionListener(this); //打開/關閉節點事件
              this.addTreeSelectionListener(this); //選擇的事件
              this.setCellRenderer(new MyTreeCellRenderer()); //生成圖標
              this.setFont(myFont);
              this.setRootVisible(true);
              this.setRowHeight(18);
              this.addMouseListener(this);
            }

            //圖標生成類
            protected class MyTreeCellRenderer
                extends JPanel
                implements TreeCellRenderer {
              JCheckBox check = new JCheckBox();
              BorderLayout borderLayout1 = new BorderLayout();
              JLabel label = new JLabel();
              public MyTreeCellRenderer() {
                this.setLayout(null);

                this.add(check);
                this.add(label);
                check.setBackground(UIManager.getColor("Tree.textBackground"));
                label.setBackground(UIManager.getColor("Tree.textBackground"));
                this.setBackground(UIManager.getColor("Tree.textBackground"));

              }

              public Dimension getPreferredSize() {
                Dimension checkDimension = check.getPreferredSize();
                Dimension labelDimension = label.getPreferredSize();
                return new Dimension(checkDimension.width + labelDimension.width,
                                     (checkDimension.height < labelDimension.height ?
                                      labelDimension.height : checkDimension.height));
              }

              public Component getTreeCellRendererComponent(JTree tree, Object value,
                                                            boolean sel, boolean expanded,
                                                            boolean leaf, int row,
                                                            boolean hasFocus) {
                String stringValue = tree.convertValueToText(value, sel, expanded, leaf,
                    row, hasFocus);
                setEnabled(tree.isEnabled());
                label.setFont(tree.getFont());
                check.setSelected( ( (FileNode) value).isSelected());
                //設置圖標為系統的文件類型圖標
                FileSystemView fileSystemView = FileSystemView.getFileSystemView();
                label.setIcon(fileSystemView.getSystemIcon( ( (FileNode) value).getFile()));
                label.setText(stringValue);
                return this;
              }

              public void doLayout() {
                Dimension checkDimension = check.getPreferredSize();
                Dimension labelDimension = label.getPreferredSize();
                int checkY = 0;
                int labelY = 0;
                if (checkDimension.height > labelDimension.height) {
                  labelY = (checkDimension.height - labelDimension.height) / 2;
                }
                else {
                  checkY = (labelDimension.height - checkDimension.height) / 2;
                }
                check.setLocation(0, checkY);
                check.setBounds(0, checkY, checkDimension.width, checkDimension.height);
                label.setLocation(checkDimension.width, labelY);
                label.setBounds(checkDimension.width, labelY, labelDimension.width,
                                labelDimension.height);
              }

            }

            //節點張開事件
            public void treeExpanded(TreeExpansionEvent event) {
              //判斷是否是葉節點
              //if (this.getLastSelectedPathComponent() == null) {
                //System.out.println("ok");
                //return;
              //}
              setCursor(new Cursor(Cursor.WAIT_CURSOR));
              TreePath path = event.getPath();
              //System.out.println(path.toString());
              FileNode node = (FileNode) path.getLastPathComponent();
              node.explore();
              treeModel.nodeStructureChanged(node);
              this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

            }

            //節點閉合事件
            public void treeCollapsed(TreeExpansionEvent event) {

            }

            //文件節點類
            protected class FileNode
                extends DefaultMutableTreeNode {

              private boolean isSelected = false;
              private boolean explored = false;

              public FileNode(File file) {
                this(file, false);
              }

              public FileNode(File file, boolean bool) {
                super(file);
                this.isSelected = bool;
              }

              //
              public boolean isSelected() {
                return isSelected;
              }

              public void setSelected(boolean isSelected) {
                this.isSelected = isSelected;
                if (children != null) {
                  Enumeration enum = children.elements();
                  while (enum.hasMoreElements()) {
                    FileNode node = (FileNode) enum.nextElement();
                    node.setSelected(isSelected);
                  }
                }
              }

              //
              public boolean getAllowsChildren() {
                return isDirectory();
              }

              public boolean isLeaf() {
                return!isDirectory();
              }

              public File getFile() {
                return (File) getUserObject();
              }

              public boolean isExplored() {
                return explored;
              }

              public void setExplored(boolean b) {
                explored = b;
              }

              public boolean isDirectory() {
                return getFile().isDirectory();
              }

              public String toString() {
                File file = (File) getUserObject();
                String filename = file.toString();
                int index = filename.lastIndexOf(File.separator);
                return (index != -1 && index != filename.length() - 1)
                    ? filename.substring(index + 1) : filename;
              }

              public void explore() {
                if (!isExplored()) {
                  File file = getFile();
                  File[] children = file.listFiles();
                  if (children == null || children.length == 0)
                    return;
                  for (int i = 0; i < children.length; ++i) {
                    File f = children[i];
                    if (f.isDirectory())
                      add(new FileNode(children[i], isSelected));
                  }
                  explored = true;
                }
              }

            }

            /**
             * 選擇節點觸發的事件
             * 繼承或是直接引用需要重新寫此方法
             * @param e
             */
            public void valueChanged(TreeSelectionEvent e) {
              //文件路徑
              String sFilePath = "";
              Object myobj = this.getLastSelectedPathComponent();
              if (myobj != null) {
                sFilePath = ( (File) ( ( (DefaultMutableTreeNode) (myobj)).getUserObject())).
                    getPath();
              }
              //System.out.println(sFilePath);
            }

            /**
             * Invoked when the mouse button has been clicked (pressed and released) on a
             * component.
             * @param e MouseEvent
             * @todo Implement this java.awt.event.MouseListener method
             */
            public void mouseClicked(MouseEvent e) {
              int count = e.getClickCount();

              if (count != 1) {
                //System.out.println(count);

              }
              else {
                int x = e.getX();
                int y = e.getY();
                int row = this.getRowForLocation(x, y);
                TreePath path = this.getPathForRow(row);
                if (path != null) {
                  FileNode node = (FileNode) path.getLastPathComponent();
                  boolean isSelected = ! (node.isSelected());
                  node.setSelected(isSelected);
                  ( (DefaultTreeModel)this.getModel()).nodeChanged(node);
                }
              }

            }

            /**
             * Invoked when a mouse button has been pressed on a component.
             * @param e MouseEvent
             * @todo Implement this java.awt.event.MouseListener method
             */
            public void mousePressed(MouseEvent e) {
            }

            /**
             * Invoked when a mouse button has been released on a component.
             * @param e MouseEvent
             * @todo Implement this java.awt.event.MouseListener method
             */
            public void mouseReleased(MouseEvent e) {
            }

            /**
             * Invoked when the mouse enters a component.
             * @param e MouseEvent
             * @todo Implement this java.awt.event.MouseListener method
             */
            public void mouseEntered(MouseEvent e) {
            }

            /**
             * Invoked when the mouse exits a component.
             * @param e MouseEvent
             * @todo Implement this java.awt.event.MouseListener method
             */
            public void mouseExited(MouseEvent e) {
            }
          }

          posted on 2006-02-19 17:59 sunfruit 閱讀(2752) 評論(10)  編輯  收藏 所屬分類: JAVA SE & EE

          評論

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-02-19 21:22 大俠

          不錯啊,呵呵  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-03-20 13:27 jack wang

          非常好!!
          如果此樹狀可以點選到檔案而非到資料夾更好.  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-03-20 14:55 sun fruit

          --sunfruit
          多謝jack wang 的意見
          原來這個樹目錄是用在資源管理器里面的,文件顯示在右面的JTable組件里面,所以就沒有顯示到文件  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-10-27 14:45 吳[匿名]

          非常好,樓豬能告訴我怎么寫一個有兩級目錄的自己定義的樹么?  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-11-20 14:59 jack[匿名]

          樓主,那右邊顯示文件的表格可否一看呢,表格的選擇模式是單列,還有文件圖標的顯示和名稱的顯示怎么來處理呢? 謝謝.
          E_mail: ccnujzw@163.com  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2006-12-13 12:45 sunfruit[匿名]

          你添加我的聯系方式,我給你相關的代碼參考  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2007-12-29 15:11 snowman

          怎么沒有main(0  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2007-12-30 12:00 fruit

          這個是組件,不需要main函數  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2008-05-01 12:59 wang

          怎么調用?  回復  更多評論   

          # re: [原創]JAVA編寫的帶有復選框的資源管理器樹目錄 2008-09-27 17:07 yingchun

          很好.  回復  更多評論   

          主站蜘蛛池模板: 伊通| 乡城县| 肇庆市| 襄垣县| 鄢陵县| 邓州市| 大厂| 宜昌市| 肃南| 锡林郭勒盟| 汉中市| 新泰市| 阿鲁科尔沁旗| 和平县| 庄河市| 汶川县| 长顺县| 简阳市| 甘洛县| 信阳市| 洛阳市| 麻江县| 长岛县| 五台县| 尼玛县| 建阳市| 西宁市| 鄂伦春自治旗| 安庆市| 新竹市| 鲁甸县| 含山县| 西城区| 上饶市| 商南县| 体育| 新干县| 涪陵区| 云南省| 南华县| 镇坪县|