In companion to the CompoundIcon article, here is a class to allow you to build up icons with overlays that can be used anywhere, but specifically in JTree.
/*
* (c)2008 mharrison
* This class is released under GPLv3
*/
package uk.co.lummie.code;
import java.awt.Component;
import java.awt.Graphics;
import java.util.Vector;
import javax.swing.Icon;
public class OverlayedIcon implements Icon {
private Vector _icons = new Vector();
private int _spaceSize = 2;
public OverlayedIcon(Icon[] icons) {
for (int i = 0; i < icons.length; i++) {
_icons.add(icons[i]);
}
}
@Override
public int getIconHeight() {
int result = 0;
for (Icon icon : getIcons()) {
result = Math.max(result, icon.getIconHeight());
}
return result;
}
@Override
public int getIconWidth() {
int result = 0;
for (Icon icon : getIcons()) {
result = Math.max(result, icon.getIconWidth());
}
return result;
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
int h = getIconHeight();
int w = getIconWidth();
for (Icon icon : getIcons()) {
icon.paintIcon(c, g, x + (w - icon.getIconWidth()) / 2, y + (h - icon.getIconHeight()) / 2);
}
}
public int getSpaceSize() {
return _spaceSize;
}
public void setSpaceSize(int spaceSize) {
this._spaceSize = spaceSize;
}
public void add(Icon icon) {
_icons.add(icon);
}
public Vector getIcons() {
return _icons;
}
}