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

    很好.  回復  更多評論   

    主站蜘蛛池模板: 亚洲国产午夜中文字幕精品黄网站| 91免费播放人人爽人人快乐| 国产区卡一卡二卡三乱码免费| 亚洲喷奶水中文字幕电影| 久久这里只精品热免费99| 亚洲一区精品无码| 182tv免费视频在线观看| 久久亚洲AV无码精品色午夜麻| 久久er国产精品免费观看8| 亚洲综合色在线观看亚洲| av午夜福利一片免费看久久| 日韩亚洲精品福利| sss在线观看免费高清| 亚洲无线一二三四区手机| 丁香花在线观看免费观看图片 | 亚洲精品国产美女久久久| 成人国产精品免费视频| 亚洲日韩精品无码专区网址| 免费在线中文日本| 亚洲视频欧洲视频| 国产成人免费高清激情视频| 亚洲精品无码久久久久久| 亚洲国产电影av在线网址| 国产高清视频免费在线观看| 久久亚洲私人国产精品| 两个人的视频高清在线观看免费 | 无码区日韩特区永久免费系列 | 亚洲午夜爱爱香蕉片| 三级网站在线免费观看| 亚洲精品视频免费看| 午夜高清免费在线观看| a一级毛片免费高清在线| 亚洲国产精品国自产拍AV| 久久精品国产免费观看| 日韩亚洲翔田千里在线| 亚洲成AV人在线观看天堂无码| 一个人免费观看视频www| eeuss在线兵区免费观看| 亚洲美女人黄网成人女| 亚洲A丁香五香天堂网| 久久国产乱子伦免费精品|