我有个目录树,里面有3层节点,我现在能实现这三层是不同的图标,但不知怎么样让在同一层下(第三层)的图标可设置不同,老区分各节点代表的含义。   import  java.awt.*;  
import  javax.swing.*;  
import  javax.swing.tree.*;  
 
public  class  MenuTree  
{  
       protected  static  final  int  filiale1=  CONSTANT  +  1;  
       protected  static  final  int  filiale2=  CONSTANT  +  2;  
       public  MenuTree()  
       {  
       }  
 
       /**  
         *  Description  :构造面版节点树  
         *  @param  dept部门名  
         *  @param  
         *  @return    tree  
         */  
 
       public  static  JTree  MenuTree(int  dept)  
       {  
               DefaultMutableTreeNode  group  =  new  DefaultMutableTreeNode("集团");  
               JTree  tree  =  new  JTree(group);  
               if  (dept=="filiale1")  
               {  
                       DefaultMutableTreeNode  company=  new  DefaultMutableTreeNode("分公司");  
                       group.add(manager);  
 
                       DefaultMutableTreeNode  manager=  new  DefaultMutableTreeNode("总经理");  
                       company.add(manager);  
 
                       DefaultMutableTreeNode  cfo=  new  DefaultMutableTreeNode("财务部长");  
                       company.add(cfo);  
 
                       DefaultMutableTreeNode  personnel1=  new  DefaultMutableTreeNode("职员");  
                       company.add(personnel1);  
 
                       DefaultMutableTreeNode  personnel2=  new  DefaultMutableTreeNode("职员");  
                       company.add(personnel2);  
 
                       DefaultMutableTreeNode  personnel3=  new  DefaultMutableTreeNode("职员");  
                       company.add(personnel3);  
               }  
 
               tree.setCellRenderer(new  TreeRenderer());  
               //tree.setToggleClickCount(10);  
               tree.addSelectionInterval(1,  10);  
               tree.setVisibleRowCount(10);  
 
               tree.setFont(new  Font("SansSerif",  Font.PLAIN,  12));  
 
               for  (int  i  =  0;  i  <  tree.getRowCount();  i++)  
               {  
                       tree.expandRow(i);  
               }  
 
               return  tree;  
       }  
 
       /**  
         *  创建节点的图标志  
         *  〈功能详细描述〉  
         *  @param  path  图标路径  
         *  @return  图标对象  
         *  @exception/throws  N/A  
         */  
       private  static  ImageIcon  createImageIcon(String  path)  
       {  
               java.net.URL  imgURL  =  imagepath.class.getResource(path);  
               if  (imgURL  !=  null)  
               {  
                       //System.out.println("url=="  +  imgURL);  
                       return  new  ImageIcon(imgURL);  
               }  
               else  
               {  
                       System.err.println("Couldn't  find  file:  "  +  path);  
                       return  null;  
               }  
       }  
 
       //Tree  render  
       private  static  class  TreeRenderer  
               extends  DefaultTreeCellRenderer  
       {  
               ImageIcon  foldercIcon  =  createImageIcon("images/folderc.jpg");  
               ImageIcon  folderoIcon  =  createImageIcon("images/foldero.jpg");  
               ImageIcon  treeIcon  =  createImageIcon("images/tree.jpg");  
               ImageIcon  managerIcon  =  createImageIcon("images/manager.jpg");  
               ImageIcon  personnelIcon  =  createImageIcon("images/personnel.jpg");  
               ImageIcon  cfoIcon  =  createImageIcon("images/cfo.jpg");  
 
               public  TreeRenderer()  
               {  
                       if  (foldercIcon  !=  null  &&  folderoIcon  !=  null)  
                       {  
                               setIcon(treeIcon);  
                               setClosedIcon(foldercIcon);  
                               setOpenIcon(folderoIcon);  
                       }  
               }  
 
               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);  
                       setText(value.toString());  
                       DefaultMutableTreeNode  node  =  (DefaultMutableTreeNode)  value;  
                       String  str  =  value.toString();  
                       if  (str.equals("总经理"))  
                       {  
                               setLeafIcon(managerIcon  );  
                       }  
                       else  if  (str.equals("财务部长"))  
                       {  
                               setLeafIcon(cfoIcon  );  
                       }  
                       else    
                       {  
                               setLeafIcon(personnelIcon);  
                       }  
                       return  this;  
               }  
       }  
}  
查了下,大概应该是这么写,但是运行结果有问题,鼠标点节点的时候老是乱变,不知为什么,哪个高手指教一下,感激不尽!!!

解决方案 »

  1.   

    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);  
    if (leaf) {
            DefaultMutableTreeNode  node  =  (DefaultMutableTreeNode)  value;  
                           String  str  =  value.toString();  
                           if  (str.equals("总经理"))  
                           {  
                                   setIcon(managerIcon  );  
                           }  
                           else  if  (str.equals("财务部长"))  
                           {  
                                   setIcon(cfoIcon  );  
                           }  
                           else    
                           {  
                                   setIcon(personnelIcon);  
                           }        }else{
            if (expanded){
              setIcon(folderoIcon);
            }else{
              setIcon(foldercIcon);
            }
          }
                           setText(value.toString());  
                                                  return  this;  
                   }  
           }  
    }  
      

  2.   

    同意chinajava(chinajava), String  str  =  value.toString();  
                           if  (str.equals("总经理"))  
                           {  
                                   setLeafIcon(managerIcon  );  
                           }  
                           else  if  (str.equals("财务部长"))  
                           {  
                                   setLeafIcon(cfoIcon  );  
                           }  
                           else    
                           {  
                                   setLeafIcon(personnelIcon);  
                           }  
    這個得问题。setLeafIcon(cfoIcon  );  是设置叶结点的图标的。。你想一下就明白了。
      

  3.   

    可以重写NodeData,在NodeData中定义属性,根据属性来设置节点图标。就象chinajava所讲的那样子
      

  4.   

    我也遇到相同的问题。后来我知道我问题出在,每次setLeafIcon是把所有的叶节点都改变了,还是没有实现同层不同节点显示不同的问题。但是我也不知道怎么解决。是不是只有像DennisVsEric(Eric)说的重写NodeData?DennisVsEric(Eric)能不能把主要代码贴一下?
      

  5.   

    chinajava(chinajava) 的代码不是和楼主的一样吗?没什么区别啊,都是用setLeafIcon,好像还是解决不了问题啊??
      

  6.   

    呵呵!不好意思!chinajava(chinajava)代码是对的!我看错了。把setLeafIcon换成setIcon就行了