<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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

    很好.  回復  更多評論   

    主站蜘蛛池模板: 男人的好看免费观看在线视频| 嫩草在线视频www免费观看| 97热久久免费频精品99| 亚洲第一AAAAA片| 久久福利青草精品资源站免费 | 亚洲人成777在线播放| 亚洲成人免费在线观看| 亚洲乱人伦精品图片| 一二三四在线播放免费观看中文版视频 | 亚洲国产精品久久久久久| 国产一二三四区乱码免费| 亚洲AV无码国产精品麻豆天美 | 亚洲毛片免费观看| 成年人网站在线免费观看| 亚洲人成人无码.www石榴| 日本一道高清不卡免费| 免费福利资源站在线视频| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲av无码专区在线电影天堂| 男女交性永久免费视频播放| 色www免费视频| 亚洲V无码一区二区三区四区观看| 免费观看在线禁片| 亚洲丝袜中文字幕| 国产禁女女网站免费看| 一级看片免费视频囗交| 亚洲国产高清视频| 成人毛片免费观看视频在线| 国产亚洲日韩在线a不卡| 亚洲开心婷婷中文字幕| 亚洲一级毛片免费在线观看| 国产精品久久亚洲一区二区| 亚洲美女又黄又爽在线观看| 在线观看H网址免费入口| 羞羞视频免费网站入口| 亚洲va久久久噜噜噜久久狠狠 | 亚洲天堂视频在线观看| 午夜一级免费视频| 成全动漫视频在线观看免费高清版下载| 91亚洲导航深夜福利| 免费一级毛片在线播放|