6.4.1. Die Generic Widget Factory Methoden

Es folgt eine Beschreibung der Methoden der Schnittstelle IGenericWidgetFactory:

Methoden zur Erzeugung von Widgets

Die folgenden Methoden dienen der Erzeugung von Widgets:

    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        WIDGET_TYPE create(DESCRIPTOR_TYPE descriptor);

    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        WIDGET_TYPE create(Object parentUiReference, DESCRIPTOR_TYPE descriptor);

Die erste Methode erzeugt Root Widgets, welche keinen Parent hat, die zweite Methode erzeugt ein Kind Widget, wobei die native UI Refrenz des Vaters übergeben wird. Client Code ruft die zweite Methode im Normalfall nicht direkt auf, außer bei der Erstellung eigener Widget Bibliotheken in einer IWidgetFactory.

Die erste Methode kann zum Beispiel für die Erzeugung eines Root Frame verwendet werden:

    final IFrame rootFrame = Toolkit.getWidgetFactory().create(BPF.frame());

Das gleiche kann man aber auch wie folgt schreiben:

    final IFrame rootFrame = Toolkit.createRootFrame(BPF.frame());
Methoden zur Registrierung und Deregistrierung von Widgets
    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        void register(
            Class<? extends DESCRIPTOR_TYPE> descriptorClass,
            IWidgetFactory<WIDGET_TYPE, ? extends DESCRIPTOR_TYPE> widgetFactory);

    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        void unRegister(Class<? extends DESCRIPTOR_TYPE> descriptorClass);

Die erste Methode registriert eine IWidgetFactory für einen definierten BluePrint Typ. Dabei darf für diesen Typ noch kein Widget registriert sein. Möchte man explizit eine Widget Factory ersetzen, um zum Beispiel eine vorhandene Widget Implementierung auszutauschen, muss man den BluePrint Typ vorab per unRegister() deregistrieren.

Die Schnittstelle IWidgetFactory ist wie folgt definiert:

  1  public interface IWidgetFactory
  2      <WIDGET_TYPE extends IWidgetCommon,
  3      DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> {
  4  
  5      WIDGET_TYPE create(Object parentUiReference, DESCRIPTOR_TYPE descriptor);
  6  }

Das folgende Beispiel zeigt eine typische Implementierung:

  1  final class BeanFormFactory<BEAN_TYPE> implements 
  2      IWidgetFactory<IBeanForm<BEAN_TYPE>, IBeanFormBluePrint<BEAN_TYPE>> {
  3  
  4      @Override
  5      public IBeanForm<BEAN_TYPE> create(
  6          final Object parentUiReference, 
  7          final IBeanFormBluePrint<BEAN_TYPE> bluePrint) {
  8          
  9          final IComposite composite = Toolkit.getWidgetFactory().create(
 10              parentUiReference, 
 11              BPF.composite());
 12          
 13          return new BeanFormImpl<BEAN_TYPE>(composite, bluePrint);
 14      }
 15  }

In Zeile 9 wird mit Hilfe der Generic Widget Factory ein Composite erzeugt. Dieses wird in Zeile 13 der BeanFormImpl übergeben. Diese verwendet das IComposite um das Formular darin darzustellen.

Abfragen einer Widget Factory

Die folgende Methode liefert eine IWidgetFactory für einen BluePrint Typ:

  <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
    IWidgetFactory<WIDGET_TYPE, DESCRIPTOR_TYPE> getFactory(
        Class<? extends DESCRIPTOR_TYPE> descriptorClass);

Falls für den BluePrint Typ keine Factory registriert ist, wird null zurückgegeben.

Dekorieren von Widgets

Die folgenden Methoden können verwendet werden, um alle Widgets oder Widget Factories für einen bestimmten Typ zu dekorieren:

    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        void addWidgetDecorator(
            Class<? extends DESCRIPTOR_TYPE> descriptorClass,
            IDecorator<WIDGET_TYPE> decorator);

    <WIDGET_TYPE extends IWidgetCommon, DESCRIPTOR_TYPE extends IWidgetDescriptor<WIDGET_TYPE>> 
        void addWidgetFactoryDecorator(
            Class<? extends DESCRIPTOR_TYPE> descriptorClass,
            IDecorator<IWidgetFactory<WIDGET_TYPE, ? extends DESCRIPTOR_TYPE>> decorator);

Weitere Information finden sich im Abschnitt Austauschen und Dekorieren von Widgets.

Widget Factory Listener

Die folgenden Methoden können verwendet werden, um einen Widget Factory Listener hinzuzufügen und zu entfernen:

    void addWidgetFactoryListener(IWidgetFactoryListener listener);

    void removeWidgetFactoryListener(IWidgetFactoryListener listener);

Ein IWidgetFactoryListener hat die folgende Methode:

    void widgetCreated(IWidgetCommon widget);

Diese Methode wird immer aufgerufen, wenn ein Widget erzeugt wird. Dies kann zum Beispiel für Debugging Zwecke oder für JUnit Tests interessant sein. Der folgende Listener wurde einer Applikation vor dem Start hinzugefügt:

  1  public final class WidgetFactoryListener implements IWidgetFactoryListener {
  2  
  3      private final Set<IWidget> allWidgets;
  4      private final Set<IWidget> undisposedWidgets;
  5  
  6      public WidgetFactoryListener() {
  7          this.allWidgets = new HashSet<IWidget>();
  8          this.undisposedWidgets = new HashSet<IWidget>();
  9      }
 10  
 11      @Override
 12      public void widgetCreated(final IWidgetCommon widgetCommon) {
 13          if (widgetCommon instanceof IWidget) {
 14              final IWidget widget = (IWidget) widgetCommon;
 15              allWidgets.add(widget);
 16              undisposedWidgets.add(widget);
 17              widget.addDisposeListener(new IDisposeListener() {
 18                  @Override
 19                  public void onDispose() {
 20                      undisposedWidgets.remove(widget);
 21                  }
 22              });
 23          }
 24      }
 25  
 26      @Override
 27      public String toString() {
 28          return "allWidgetsCount="
 29                  + allWidgets.size() 
 30                  + ", undisposedWidgetsCount=" 
 31                  + undisposedWidgets.size();
 32      }
 33  
 34  }

Nach dem Beenden wurde die toString() Methode aufgerufen. Das führte zu folgender Ausgabe:

    allWidgetsCount=48, undisposedWidgetsCount=0

Anschließend wurde in der Implementierung von IContainer ein Fehler eingebaut, so dass die Kinder eines Containers nicht mehr disposed wurden. Nach erneutem Start und Beenden ergab sich die folgende Ausgabe:

    allWidgetsCount=48, undisposedWidgetsCount=45

Siehe auch PDF Version dieses Dokuments, Jowidgets API Spezifikation