Jowidgets ist eine API zur Erstellung von graphischen Benutzeroberflächen mit Java.
Der kritische Leser stellt sich nun eventuell die Frage: „Warum noch ein UI Framework, gibt es da nicht schon genug?“
Die Erfahrung bei der Entwicklung von graphischen Oberflächen in unterschiedlichen Unternehmen hat gezeigt, das für viele in Unternehmen typischen Anwendungsfälle oft keine Lösungen in Standard UI Frameworks existieren, und aus dieser Not heraus das Rad für diese immer wieder neu erfunden wird.
Hierzu ein kleines Beispiel. In einer Eingabemaske soll in ein
Eingabefeld eine Zahl eingegeben werden. Die Eingabe soll
validiert werden, und der Nutzer soll ein möglichst für ihn
verständliches Feedback bekommen, wenn etwas falsch ist. Für die
Eingabe bietet Swing ein JTextField
. Dieses
liefert aber einen String und keine Zahl zurück, das heißt der
Wert muss erst konvertiert werden. Für die Anzeige des
Validierungsfeedback könnte man in Swing ein
JLabel
verwenden. Da man Anwendungsfälle wie
die Eingabe von Zahlen, Eingabe eines Datum, Anzeige von
Validierungsfehlern, etc. in sehr vielen Softwarehäusern
vorfindet, existieren vermutlich auch in jeder dieser
firmeninternen UI Bibliothek Widgets wie:
InputNumberField
,
ValidatedInputNumberField
,
ValidatedDateField
,
ValidationLabel
usw.. Wer sich hier
wieder findet oder wer vielleicht selbst
schon mal solch ein Widget implementiert oder verwendet hat, für
den könnte jowidgets möglicherweise genau das
richtige UI Framework sein.
Im Vergleich zu herkömmlichen Technologien wie Swing, oder JavaFx liefert jowidgets kein eigenständiges Rendering für Basiswidgets [1], sondern lediglich Adapter, welche die jowidgets Widget Schnittstellen implementieren. Dadurch ist es möglich, UI Code, welcher gegen das jowidgets API implementiert wurde, mit quasi jedem Java UI Framework auszuführen. Derzeit existieren Adapter (SPI Implementierungen, siehe Architektur) für Swing, SWT und RWT. Die RWT Implementierung ermöglicht es somit sogar eine jowidgets Applikation als Webapplikation im Browser auszuführen. Eine JavaFx Adapter Implementierung wurde im Rahmen einer Bachelorarbeit prototypisch umgesetzt. Es existieren Bundle Manifeste für OSGi, so dass auch ein Einsatz in Eclipse RCP (siehe Jowidgets und RCP) ohne weiters möglich ist.
Aufbauend auf den Basiswidgets existieren wie bereits weiter oben angedeutet zusätzliche Composite Widgets und Features, welche sich in herkömmlichen UI-Frameworks nicht finden. Zwei davon sollen an dieser Stelle exemplarisch vorgestellt werden.
Beispielsweise gibt es ein generisches
InputField<VALUE_TYPE>
.
Dieses hat Methoden wie VALUE_TYPE getValue()
oder setValue(VALUE_TYPE value)
. Für
Standarddatentypen wie Integer
,
Long
, Double
,
Float
, Date
, etc. existieren
bereits Defaultimplementierungen. Im obigen Beispiel würde das
Eingabefeld also bereits eine Zahl liefern. Mit Hilfe von
Convertern kann aber auch jeder beliebige andere Datentyp
unterstützt werden. Für ein InputField
lassen
sich auch beliebige Validatoren definieren. Zudem kann die UI an
ObservableValues
gebunden werden.
Für das nächste Feature betrachten wir noch einmal das vorige
Beispiel mit dem Eingabefeld von Zahlen. Für die
Validierungsausgabe könnte ein ValidationLabel Widget erstellt
worden sein, welches Warnungen und Fehler mit entsprechenden Icons
und / oder Fehlertext anzeigen kann. Dabei kann man sowohl die
Icons als auch die Farbe konfigurieren, weil Kunde A Fehler nur
mit dezenten Farben angzeigt bekommen möchte
(laut Aussage seiner Mitarbeiter bekommt man von der standardmäßig
verwendeten Farbe Augenkrämpfe), Kunde B kann
aber Validierungsfehler, die nicht fett und
rot angezeigt werden, gar nicht wahrnehmen,
was die Applikation für ihn unbrauchbar macht. Stellen wir uns nun
weiter vor, diese Eingabefelder und Validierungslabels sind in ein
Widget mit dem Namen GenericInputForm
eingebettet, welches sowohl von Kunde A als auch von Kunde B
verwendet wird, und stellen wir uns weiter vor, dass die
verwendeten Widgets noch weitere Konfigurationsattribute haben,
dann müssten diese alle auch für das
GenericInputForm
konfigurierbar sein.
Spätestens wenn dieses in ein weiteres Modul eingebettet ist, wird
klar, dass dieses Vorgehen schnell unpraktikabel wird.
In jowidgets ist es u.A. für solche Anwendungsfälle möglich, für jedes beliebige Widget die Defaulteinstellungen global umzudefinieren (siehe dazu Widget Defaults). So könnte man im genannten Beispiel die gleiche Applikation einmal mit roten und einmal mit grauen Validierungslabels ausliefern, ohne dazu die eigentliche Applikation anpassen zu müssen. Mit der gleichen Methode könnte man zum Beispiel auch die Reihenfolge für Buttons in Eingabedialogen anpassen, definieren in welchem Format Datumswerte angezeigt werden sollen, definieren ob Buttons für Speichern und Abbrechen auf jedem Formular oder nur in der Toolbar vorhanden sind, uvm..