用jt.setCellRenderer(new CellRenderer());
下面试我做过的一个类,看看吧,很容易mport java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.plaf.ColorUIResource;public class MyCellRenderer extends JPanel implements TreeCellRenderer {
    //protected JCheckBox check;
    protected TreeLabel label;
    ImageIcon icon1 = new ImageIcon(
            PcedMainFrame.class.getResource("whitepoint.gif"));
    ImageIcon icon2 = new ImageIcon(
            PcedMainFrame.class.getResource("blackpoint.gif"));    public MyCellRenderer() {
        setLayout(null);
        add(label = new TreeLabel());
        label.setForeground(UIManager.getColor("Tree.textForeground"));
    }    public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean isSelected, boolean expanded,
            boolean leaf, int row, boolean hasFocus) {
        String  stringValue = tree.convertValueToText(value, isSelected,
                expanded, leaf, row, hasFocus);
        setEnabled(tree.isEnabled());
        label.setFont(tree.getFont());
        label.setText(stringValue);
        label.setSelected(isSelected);
        label.setFocus(hasFocus);
        if(isSelected){
            label.setIcon(icon2);
        }else{
            label.setIcon(icon1);
        }
        return this;
    }    public Dimension getPreferredSize() {
        Dimension d_label = label.getPreferredSize();
        return new Dimension(d_label.width, d_label.height);
    }    public void doLayout() {
        Dimension d_label = label.getPreferredSize();
        int y_check = 0;
        int y_label = 0;
        y_label = (d_label.height)/2;
        label.setLocation(0,y_label);
        label.setBounds(0,0,d_label.width,d_label.height);
    }    public void setBackground(Color color) {
        if (color instanceof ColorUIResource)
            color = null;
        super.setBackground(color);
    }    public class TreeLabel extends JLabel {
        boolean isSelected;
        boolean hasFocus;        public TreeLabel() {
        }        public void setBackground(Color color) {
            if(color instanceof ColorUIResource)
                color = null;
            super.setBackground(color);
        }        public void paint(Graphics g) {
            String str;
            if ((str = getText()) != null) {
                if (0 < str.length()) {
                    if (isSelected) {
                        label.setForeground(Color.white);
                        g.setColor(Color.BLUE);
                    } else {
                        label.setForeground(Color.black);
                        g.setColor(UIManager.getColor("Tree.textBackground"));
                    }
                    Dimension d = getPreferredSize();
                    int imageOffset = 0;
                    Icon currentI = getIcon();
                    if (currentI != null) {
                        imageOffset = currentI.getIconWidth() + Math.max(0, getIconTextGap() - 1);
                    }
                    g.fillRect(imageOffset, 0, d.width -1 - imageOffset, d.height);
                    if (hasFocus) {
                        g.setColor(UIManager.getColor("Tree.selectionBorderColor"));
                        g.drawRect(imageOffset, 0, d.width -1 - imageOffset, d.height -1);
                    }
                }
            }
            super.paint(g);
        }        public Dimension getPreferredSize() {
            Dimension retDimension = super.getPreferredSize();
            if (retDimension != null) {
                retDimension = new Dimension(retDimension.width + 3,
                        retDimension.height);
            }
            return retDimension;
        }        public void setSelected(boolean isSelected) {
            this.isSelected = isSelected;
        }        public void setFocus(boolean hasFocus) {
            this.hasFocus = hasFocus;
        }
    }
}

解决方案 »

  1.   

    如果只是要求更改图标的话,似乎没那么复杂。我在作的一项目是关于Case的,里面有Class View的部分,就是用JTree完成的,要求是每个节点都可以有不同Iconpublic class IconTreeCellRenderer extends DefaultTreeCellRenderer{private IconChooser iconChooser;public void setIconChooser(IconChooser iconChooser){
         this.iconChooser = iconChooser;
    }public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {        super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
            Object obj = ((DefaultMutableTreeNode)value).getUserObject();
            Icon icon = iconChooser.getIcon(obj);
            if (icon != null)
                setIcon(icon);
            return this;
        }
    }interface IconChooser{
         public Icon getIcon(Object userObject);
    }然后实现IconChooser接口,根据userObject判断,返回Icon,我们在实际应用觉得这是一种最简单的实现方案。