请教JTree中怎么任意设置TreeNode的图标?

时间:2022-04-02 12:32:45
这个问题在论坛虽然能搜索到,但是和很多很好的文章一样,都是“该页无法显示”,可恶 >:0

谁能打开这个帖子把内容贴上来我也给分:
标题:√请问如何将树(JTree)的节点设置成不同的图标?100分献上!
http://expert.csdn.net/Expert/topic/1117/1117640.xml?temp=.686001

4 个解决方案

#1


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);

#2


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

#3


这句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);
    }
}

#4


写一个类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了

#1


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);

#2


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

#3


这句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);
    }
}

#4


写一个类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了