Vincent.Chan‘s Blog

          常用鏈接

          統計

          積分與排名

          網站

          最新評論

          [原創]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 14:36 Vincent.Chen 閱讀(882) 評論(0)  編輯  收藏 所屬分類: Java

          主站蜘蛛池模板: 长武县| 分宜县| 巩义市| 垫江县| 沅陵县| 新乐市| 上犹县| 临湘市| 会泽县| 河西区| 米泉市| 旅游| 屏边| 托里县| 玉田县| 河西区| 措美县| 铜梁县| 顺昌县| 肥东县| 买车| 镇康县| 台州市| 偏关县| 镇安县| 宾川县| 吴江市| 巍山| 辉县市| 环江| 缙云县| 江达县| 曲沃县| 濮阳县| 会宁县| 大安市| 曲阜市| 东方市| 柳州市| 年辖:市辖区| 邵阳县|