Es folgt eine Beschreibung der Methoden der Schnittstelle
                    IGenericWidgetFactory:
                  
         
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());
    <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.
                       
            
                         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.
                       
            
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.
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