Table mit Images (OwnerDrawLabelProvider)
org.eclipse.jface.viewers.OwnerDrawLabelProvider
Der LabelProvider verfügt zwar über die Methode getImage(), diese ist jedoch nur in sehr einfachen Fällen verwendbar. Spezielle wenn in der Tabelle in mehreren Spalten Images dargestellt werden sollen gibt es viele Probleme.
Der Ausweg aus diesem Dilemma besteht in einem eigenen OwnerDrawLabelProvider.
Im folgenden Beispiel wird ein LabelProvider erstellt, welche das Image einer Checkbox verwendet. Somit kann dieser LabelProvider Boolean-Werte als CheckBox darstellen.
public class CheckBoxLabelProvider extends OwnerDrawLabelProvider{ private static final String KEY_CHECKED = "checkedImageCheckBox"; private static final String KEY_UNCHECKED = "uncheckedImageCheckBox"; public CheckBoxLabelProvider() { if (JFaceResources.getImageRegistry().getDescriptor(KEY_CHECKED) == null) { JFaceResources.getImageRegistry().put(KEY_CHECKED, createImageFromCheckBox(true)); JFaceResources.getImageRegistry().put(KEY_UNCHECKED, createImageFromCheckBox(false)); } } public Image getImage(Object element) { Boolean b = (Boolean)element; if (b == null) b = Boolean.FALSE; Image img; if (b.booleanValue()) img = JFaceResources.getImageRegistry().get(KEY_CHECKED); else img = JFaceResources.getImageRegistry().get(KEY_UNCHECKED); return img; } /** * Erzeugt einen "Screenshot" von einer CheckBox * @param type Checked oder unchecked * @return Das CheckBox image */ private Image createImageFromCheckBox(boolean type) { Shell s = new Shell(getTableViewer().getControl().getShell(), SWT.NO_TRIM); Button b = new Button(s, SWT.CHECK); b.setSelection(type); Point bsize = b.computeSize(SWT.DEFAULT, SWT.DEFAULT); b.setSize(bsize); b.setLocation(0, 0); s.setSize(bsize); s.open(); GC gc = new GC(b); Image image = new Image(Display.getCurrent(), bsize.x, bsize.y); gc.copyArea(image, 0, 0); gc.dispose(); s.close(); return image; } @Override protected void measure(Event event, Object element){ } @Override protected void paint(Event event, Object element){ Image img = getImage(element); Rectangle bounds = ((TableItem) event.item).getBounds(event.index); Rectangle imgBounds = img.getBounds(); bounds.width /= 2; bounds.width -= imgBounds.width / 2; bounds.height /= 2; bounds.height -= imgBounds.height / 2; int x = (bounds.width > 0 ? bounds.x + bounds.width : bounds.x); int y = bounds.height > 0 ? bounds.y + bounds.height : bounds.y; event.gc.drawImage(img, x, y); } }