3.7.1. Widget Wrapper in Kombination mit der IWidgetFactory

Widget Wrapper werden unter anderem bei der Erstellung eigener Widget Bibliotheken benötigt.

Das folgende Beispiel zeigt die Widget Factory und Implementierung des Label Widget. Ein Label Widget besteht aus einen Icon und einem Text Label.

  1  public final class LabelFactory implements IWidgetFactory<ILabel, ILabelDescriptor> {
  2  
  3      @Override
  4      public ILabel create(final Object parentUiReference, final ILabelDescriptor descriptor) {
  5          final ICompositeBluePrint compositeBp = BPF.composite();
  6          compositeBp.setSetup(descriptor);
  7  
  8          final IComposite composite = Toolkit.getWidgetFactory().create(
  9              parentUiReference, 
 10              compositeBp);
 11              
 12          return new LabelImpl(composite, descriptor);
 13      }
 14  
 15  }

Für die Implementierung soll ein Composite verwendet werden, welches das Icon und das Text Label enthält. In Zeile 5 wird ein Composite BluePrint erstellt. In Zeile 6 werden alle passenden Parameter des Label Descriptor auch auf dem Composite gesetzt. In Zeile 8 wird das Composite erzeugt und in Zeile 12 wir dieses an die Klasse LabelImpl übergeben.

Die Klasse LabelImpl sieht wie folgt aus:

  1  public final class LabelImpl extends ControlWrapper implements ILabel {
  2  
  3      private final IIcon iconWidget;
  4      private final ITextLabel textLabelWidget;
  5      private final IComposite composite;
  6  
  7      private String text;
  8      private IImageConstant icon;
  9  
 10      public LabelImpl(final IComposite composite, final ILabelSetup setup) {
 11          super(composite);
 12  
 13          this.composite = composite;
 14  
 15          final IIconDescriptor iconDescriptor = BPF.icon(setup.getIcon()).setSetup(setup);
 16          this.iconWidget = composite.add(iconDescriptor, "w 0::");
 17          this.icon = setup.getIcon();
 18  
 19          final ITextLabelDescriptor textLabelDescriptor = BPF.textLabel().setSetup(setup);
 20          this.textLabelWidget = composite.add(textLabelDescriptor, "w 0::");
 21  
 22          setLayout();
 23  
 24          VisibiliySettingsInvoker.setVisibility(setup, this);
 25          ColorSettingsInvoker.setColors(setup, this);
 26      }
 27  
 28      @Override
 29      public void setToolTipText(final String text) {
 30          textLabelWidget.setToolTipText(text);
 31          iconWidget.setToolTipText(text);
 32      }
 33  
 34      @Override
 35      public void setForegroundColor(final IColorConstant colorValue) {
 36          textLabelWidget.setForegroundColor(colorValue);
 37      }
 38  
 39      @Override
 40      public void setBackgroundColor(final IColorConstant colorValue) {
 41          textLabelWidget.setBackgroundColor(colorValue);
 42          iconWidget.setBackgroundColor(colorValue);
 43      }
 44  
 45      //... removed some methods in example
 46  
 47  }

Es wird von der Klasse ControlWrapper abgeleitet. Dadurch werden alle Methoden von IControl, die nicht von LabelImpl überschrieben werden, an das Composite delegiert.

Hinweis: Es wurde bewusst nicht von CompositeWrapper abgeleitet, da die Schnittstelle ILabel auch nicht von IComposite abgeleitet ist. Bei der Verwendung von Swing oder Swt findet man häufig eigene, firmen- oder projektinterne Widgets, die zum Beispiel von JPanel oder Composite angeleitet sind. Diese haben dadurch in Ihrer öffentlichen Schnittstelle Methoden wie remove(), add() oder setLayout() welche vom Benutzer des Widgets nicht verwendet werden sollten (zum Beispiel hat ein Label Widget keine setLayout() oder remove() Methode). Bei der Erstellung eigener Widget Bibliotheken kann man explizit die Schnittstelle für das Widget (z.B. ILabel) festlegen. Dadurch wäre auch das Ableiten von CompositeWrapper nicht tragisch, da die Widget Factory nur ein ILabel zurückgibt. Wird keine eigene Widget Schnittstelle festgelegt ist es jedoch umso wichtiger, keinen Wrapper zu verwenden, durch den man Methoden erbt, die für das Widget nicht sinvoll sind.


Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation