Dies ist eine alte Version des Dokuments!


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.

private 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;
   }
 
   /**
    * Erzerugt 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);
   }
}

Eigene Werkzeuge
Werkzeuge

gratis Counter by GOWEB
seit 9.10.2007