和風細雨

          世上本無難事,心以為難,斯乃真難。茍不存一難之見于心,則運用之術自出。

          擴展DefaultTreeCellRenderer創建自己的樹節點渲染器示例。

          通常來說,使用下面的方法確實能改變樹節點的圖標,但靈活性不高。
          // 設定葉節點圖標
          Icon leafIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/leaf.gif"));
          // 設定關閉狀態節點圖標
          Icon closedIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/close.gif"));
          // 設定打開狀態節點圖標
          Icon openIcon = new ImageIcon(TreeViewPanel.class
                  .getResource(
          "/open.gif"));

          // 取得樹的渲染器
          DefaultTreeCellRenderer renderer = (DefaultTreeCellRenderer) tree
                  .getCellRenderer();

          // 設定葉節點圖標
          renderer.setLeafIcon(leafIcon);

          // 設定關閉狀態節點圖標
          renderer.setClosedIcon(closedIcon);

          // 設定打開狀態節點圖標
          renderer.setOpenIcon(openIcon);

          但這樣靈活性不高,如我想每層的圖標都不一樣就不能使用這種方法了,我想要的效果如下:


          這時我們只有擴展DefaultTreeCellRenderer創建自己的樹節點渲染器,我創建的渲染器代碼如下:
          package com.sitinspring.common.render;

          import java.awt.Component;

          import javax.swing.Icon;
          import javax.swing.ImageIcon;
          import javax.swing.JTree;
          import javax.swing.tree.DefaultMutableTreeNode;
          import javax.swing.tree.DefaultTreeCellRenderer;
          import javax.swing.tree.TreeNode;

          /**
           * 樹節點渲染器
           * 
          @author: sitinspring(junglesong@gmail.com)
           * @date: 2008-2-12
           
          */

          public class TreeNodeRenderer extends DefaultTreeCellRenderer{
              
          private static final long serialVersionUID = 8532405600839140757L;
              
              
          // 數據庫圖標,頂層節點用
              private static final Icon databaseIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/database.gif"));
              
              
          // 表圖標,第三層節點用
              private static final Icon tableIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/leaf.gif"));
              
              
          // 表空間關閉狀態圖標,關閉狀態的第二層節點用
              private static final Icon tableSpaceCloseIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/close.gif"));
              
              
          // 表空間關閉狀態圖標,打開狀態的第二層節點用
              private static final Icon tableSpaceOpenIcon = new ImageIcon(TreeNodeRenderer.class
                      .getResource(
          "/open.gif"));
              
              
          public Component getTreeCellRendererComponent(JTree tree,
                                                            Object value,
                                                            
          boolean sel,
                                                            
          boolean expanded,
                                                            
          boolean leaf,
                                                            
          int row,
                                                            
          boolean hasFocus){
                   
          super.getTreeCellRendererComponent(tree,   
                                                      value,
                                                      sel,   
                                                      expanded,   
                                                      leaf,   
                                                      row,   
                                                      hasFocus);   
                  
          // 取得節點
                  DefaultMutableTreeNode node=(DefaultMutableTreeNode)value;
                  
                  
          // 取得路徑
                  TreeNode[] paths = node.getPath();
                  
                  
          // 按路徑層次賦予不同的圖標
                  if (paths.length == 3{            
                      setIcon(tableIcon);
                  }
          else if(paths.length == 2){
                      
          // 按展開情況再賦予不同的圖標
                      if(expanded){
                          setIcon(tableSpaceOpenIcon);
                      }

                      
          else{
                          setIcon(tableSpaceCloseIcon);
                      }

                  }

                  
          else if(paths.length == 1){
                      setIcon(databaseIcon);
                  }

                  
                  
          return this;        
              }

          }

          使用這個渲染器使用以下代碼就行了:
          tree.setCellRenderer(new TreeNodeRenderer());

          以上。

          posted on 2008-02-22 09:12 和風細雨 閱讀(2831) 評論(0)  編輯  收藏 所屬分類: Swing

          主站蜘蛛池模板: 九江市| 阿坝县| 吴旗县| 永清县| 涟水县| 治多县| 漳州市| 塔河县| 南岸区| 墨脱县| 姜堰市| 盐源县| 西安市| 达拉特旗| 永春县| 凤山县| 昌宁县| 沙田区| 漠河县| 浦县| 鹤峰县| 金沙县| 广东省| 芦溪县| 吴桥县| 宜宾县| 桐柏县| 舟山市| 伊宁县| 佛冈县| 漠河县| 宣威市| 黎川县| 达孜县| 广州市| 改则县| 宝清县| 莲花县| 耒阳市| 天津市| 永清县|