表格和树的项只可以有一个图像,而且这个图像只能够画在图像的前面。
学习了定制表格和树的项后,觉得前面也可以定制多个图像了。
例子:
public class Snippet300 {
private static int IMAGE_MARGIN = 2;
private static Image xImage;
private static Display display;
public static void main(String [] args) {
display = new Display();
Shell shell = new Shell(display);
shell.setBounds(10, 10, 350, 200);
createImage();
final Tree tree = new Tree(shell, SWT.CHECK);
tree.setBounds(10, 10, 300, 150);
TreeItem item = new TreeItem(tree, SWT.NONE);
item.setImage(xImage);
item.setText("root item");
for (int i = 0; i < 4; i++) {
TreeItem newItem = new TreeItem(item, SWT.NONE);
newItem.setText("descendent " + i);
// if (i % 2 == 0) {
// newItem.setData(xImage);
// }
newItem.setImage(xImage);
item.setExpanded(true);
item = newItem;
}
treeAddListener(tree);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
xImage.dispose();
display.dispose();
}
private static void createImage() {
xImage = new Image (display, 16, 16);
GC gc = new GC(xImage);
gc.setForeground(display.getSystemColor(SWT.COLOR_RED));
gc.drawLine(1, 1, 14, 14);
gc.drawLine(1, 14, 14, 1);
gc.drawOval(2, 2, 11, 11);
gc.dispose();
}
private static void treeAddListener(final Tree tree) {
Listener listener = new Listener() {
public void handleEvent(Event event) {
TreeItem item = (TreeItem)event.item;
Image image = (Image)item.getImage();
switch(event.type) {
case SWT.MeasureItem:
{
if (image == null) break;
event.width += 2*(image.getBounds().width + IMAGE_MARGIN);
break;
}
case SWT.EraseItem:
{
event.detail &= ~SWT.FOREGROUND;
break;
}
case SWT.PaintItem:
{
if (image == null) break;
int x,y;
int itemH = tree.getItemHeight();
int imageH = image.getBounds().height;
int imageW = image.getBounds().width;
// draw the 1 image
x = event.x ;
y = event.y + (itemH - imageH)/2;
event.gc.drawImage(image, x, y);
// draw the 2 image
x += IMAGE_MARGIN + imageW;
event.gc.drawImage(image, x, y);
// draw the string
String text = item.getText();
x += IMAGE_MARGIN + imageW;
y = event.y+2;
event.gc.drawText(text, x, y);
// draw the 3 image
x += event.width - imageW;
y = event.y + (itemH - imageH)/2;
event.gc.drawImage(image, x, y);
break;
}
}
}
};
tree.addListener(SWT.MeasureItem, listener);
tree.addListener(SWT.EraseItem, listener);
tree.addListener(SWT.PaintItem, listener);
}
}
改例子,仿照snippet220写的,运行效果,如图: