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.