<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 閱讀(2759) 評論(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

    很好.  回復  更多評論   

    主站蜘蛛池模板: 99精品视频在线免费观看| 污视频网站免费在线观看| 午夜不卡久久精品无码免费| 久久乐国产精品亚洲综合| 日本精品久久久久久久久免费| 日本一道本高清免费| 亚洲AV无码男人的天堂| 午夜免费不卡毛片完整版| 亚洲人成网站999久久久综合| 1000部啪啪毛片免费看| 亚洲国产人成在线观看69网站| 久操免费在线观看| 人妻视频一区二区三区免费| 亚洲网站在线播放| 4虎永免费最新永久免费地址| 亚洲av无码不卡私人影院| 亚洲处破女AV日韩精品| 久久青草免费91观看| 久久久国产精品亚洲一区| 亚洲黄色免费网站| 亚洲色无码专区一区| 日韩亚洲精品福利| 永久免费A∨片在线观看| 亚洲VA中文字幕无码毛片| 99re在线这里只有精品免费| 国产色在线|亚洲| 99精品免费观看| 亚洲AV无码专区在线亚| 国产成人免费网站在线观看| a免费毛片在线播放| 久久亚洲精品中文字幕无码 | 亚洲精品视频在线免费| 好吊妞视频免费视频| 四虎一区二区成人免费影院网址| 国产亚洲av片在线观看播放| 黄在线观看www免费看| 国产成人高清亚洲一区久久| 亚洲乱亚洲乱妇无码麻豆| h视频在线免费观看| 亚洲AV无码一区东京热| 成人人免费夜夜视频观看|