根据深度级别更改JTree节点图标

时间:2011-01-09 18:07:49

标签: java swing icons jtree

我正在寻找改变我的JTree(Swing)的不同图标

java文档解释了如果节点是否为叶子,如何更改图标,但这实际上不是我正在搜索的内容。

对我而言,节点是否为叶子无关紧要,如果节点处于三个节点的第一/第二/第三深度级别,我只想更改图标。

2 个答案:

答案 0 :(得分:8)

作为自定义TreeCellRenderer的替代方案,您可以替换collapsedIconexpandedIcon的用户界面默认值:

Icon expanded = new TreeIcon(true, Color.red);
Icon collapsed = new TreeIcon(false, Color.blue);
UIManager.put("Tree.collapsedIcon", collapsed);
UIManager.put("Tree.expandedIcon", expanded);

TreeIcon只是Icon接口的实现:

class TreeIcon implements Icon {

    private static final int SIZE = 14;
    private boolean expanded;
    private Color color;

    public TreeIcon(boolean expanded, Color color) {
        this.expanded = expanded;
        this.color = color;
    }

    //@Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setPaint(color);
        if (expanded) {
            g2d.fillOval(x + SIZE / 4, y, SIZE / 2, SIZE);
        } else {
            g2d.fillOval(x, y + SIZE / 4, SIZE, SIZE / 2);
        }
    }

    //@Override
    public int getIconWidth() {
        return SIZE;
    }

    //@Override
    public int getIconHeight() {
        return SIZE;
    }
}

答案 1 :(得分:5)

实现自定义TreeCellRenderer - 对组件使用JLabel,然后使用存储在树中的对象数据设置其图标。如果对象是原始对象(例如String)

,则可能需要包装对象以存储其深度等

http://download.oracle.com/javase/7/docs/api/javax/swing/tree/TreeCellRenderer.html http://www.java2s.com/Code/Java/Swing-JFC/TreeCellRenderer.htm