DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
renderer.setLeafIcon(new ImageIcon("a.gif"));
renderer.setClosedIcon(new ImageIcon("b.gif"));
renderer.setOpenIcon(new ImageIcon("c.gif"));
tree.setCellRenderer(renderer);

解决方案 »

  1.   

    这是设置Tree中所有节点统一的图标压
    我要的是设置任意节点的图标
    比如说同一层上有不同的图标
    就像jbuilder的树一样,package\jar\ear\java\jsp用不同的图标来区分
      

  2.   

    这句DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();改成下面这种类就行了,你看一下。import javax.swing.Icon;
    import javax.swing.ImageIcon;
    import javax.swing.JLabel;
    import javax.swing.JTree;
    import javax.swing.tree.TreeCellRenderer;
    import javax.swing.tree.DefaultMutableTreeNode;
    import java.awt.Component;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer
    {
        /** Font used if the string to be displayed isn't a font. */
        static protected Font             defaultFont;
        /** Icon to use when the item is collapsed. */
        static protected ImageIcon        collapsedIcon;
        /** Icon to use when the item is expanded. */
        static protected ImageIcon        expandedIcon;    /** Color to use for the background when selected. */
        static protected final Color SelectedBackgroundColor = Color.yellow;//new Color(0, 0, 128);    static
        {
    try {
        defaultFont = new Font("SansSerif", 0, 12);
    } catch (Exception e) {}
    try {
        collapsedIcon = new ImageIcon("images/collapsed.gif");
        expandedIcon = new ImageIcon("images/expanded.gif");
    } catch (Exception e) {
        System.out.println("Couldn't load images: " + e);
    }
        }    /** Whether or not the item that was last configured is selected. */
        protected boolean            selected;    /**
          * This is messaged from JTree whenever it needs to get the size
          * of the component or it wants to draw it.
          * This attempts to set the font based on value, which will be
          * a TreeNode.
          */
        public Component getTreeCellRendererComponent(JTree tree, Object value,
      boolean selected, boolean expanded,
      boolean leaf, int row,
      boolean hasFocus) {
    Font            font;
    String          stringValue = tree.convertValueToText(value, selected,
       expanded, leaf, row, hasFocus); /* Set the text. */
    setText(stringValue);
    /* Tooltips used by the tree. */
    setToolTipText(stringValue); /* Set the image. 想怎么玩就改这里*/
    if(expanded)
        setIcon(expandedIcon);
    else if(!leaf)
        setIcon(collapsedIcon);
    else
        setIcon(null); /* Set the color and the font based on the SampleData userObject. */
    SampleData         userObject = (SampleData)((DefaultMutableTreeNode)value)
                                    .getUserObject();
    if(hasFocus)
        setForeground(Color.cyan);
    else
        setForeground(userObject.getColor());
    if(userObject.getFont() == null)
        setFont(defaultFont);
    else
        setFont(userObject.getFont()); /* Update the selected flag for the next paint. */
    this.selected = selected; return this;
        }    /**
          * paint is subclassed to draw the background correctly.  JLabel
          * currently does not allow backgrounds other than white, and it
          * will also fill behind the icon.  Something that isn't desirable.
          */
        public void paint(Graphics g) {
    Color            bColor;
    Icon             currentI = getIcon(); if(selected)
        bColor = SelectedBackgroundColor;
    else if(getParent() != null)
        /* Pick background color up from parent (which will come from
           the JTree we're contained in). */
        bColor = getParent().getBackground();
    else
        bColor = getBackground();
    g.setColor(bColor);
    if(currentI != null && getText() != null) {
        int          offset = (currentI.getIconWidth() + getIconTextGap());            if (getComponentOrientation().isLeftToRight()) {
                    g.fillRect(offset, 0, getWidth() - 1 - offset,
                               getHeight() - 1);
                }
                else {
                    g.fillRect(0, 0, getWidth() - 1 - offset, getHeight() - 1);
                }
    }
    else
        g.fillRect(0, 0, getWidth()-1, getHeight()-1);
    super.paint(g);
        }
    }
      

  3.   

    写一个类EnhancedTreeCellRenderer extends DefaultTreeCellRenderer
    改写其方法getTreeCellRendererComponent,如下。其中NodeInformation为自己的存在TreeNode中的类,根据它的一个Field int type来决定显示那个图标。
    public class EnhancedTreeCellRenderer extends DefaultTreeCellRenderer{
    private Icon root,bean,trade,buss,from;
    public EnhancedTreeCellRenderer() {
    root = Utilities.getIcon("./images/Host16.gif");
    bean = Utilities.getIcon("./images/Bean16.gif");
    trade = Utilities.getIcon("./images/Movie16.gif");
    buss = Utilities.getIcon("./images/War16.gif");
    from = Utilities.getIcon("./images/WebComponent16.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;
    NodeInformation nodeInfo = (NodeInformation)(node.getUserObject());
    int type = nodeInfo.getNodeType();
    switch(type) {
    case 0 :setIcon(root);
    break;
    case 5 :setIcon(buss);
    break;
    case 6 :setIcon(from);
    break;
    case 18:setIcon(trade);
    break;
    case 12:
    case 13:setIcon(bean);
    break;
    default :
    break;
    }

    return this;
    }
    }
    再使用
    tree.setCellRenderer(new EnhancedTreeCellRenderer());
    就一切ok了