Fat - Clients mit Java Swing
Darstellung einer modernen SWING GUI
unter Verwendung aktuell verfügbarer Technologien.
Motivation
Ausgehend vom Vorbild SWT/JFaces (Eclipse Projekt) wurde der Versuch
unternommen, eine moderne und ansprechende Oberfläche in Swing
nachzubilden und diese als prototypische Basis für ein Thin Client Framework
vorzustellen. Folgende Aspekte wurden bei der Erstellung der Demonstration
betrachtet:
Abbildung einer anpassbaren Standardapplikation ohne Ausprägung auf
fachliche Aspekte.
Schaffung eines Basisframeworks für die Anwendungsentwicklung.
Modularisierung und Kapselung technischer Aspekte.
Weitgehende Ausnutzung vorhandener Technologien und Bibliotheken.
Automatisierung von Layoutfunktionen durch generische Komponenten
und Layoutmechanismen.
Die nachfolgenden Screenshots und Beispiele bilden kein vollständig
funktionsfähiges Framework ab, sondern sind in einer frühen Beta- und
Experimentierphase. In erster Linie sollen Ausprägungen eines möglichen
View Frameworks aufgezeigt werden. Letzte Änderungen am Framework
erfolgten aushgehend von den Erfahrungen der Projekte Harpoon & Phoenics.
Vorschau - Übersicht
Arbeitsbereich mit einigen Auswahlreitern und Detailfenstern. Das vorliegende Beispiel entstamm dem Verlagswesen, ist
jedoch auf andere prozessgetriebene Bereiche Übertragbar.
Vorschau - Details
Arbeitsbereich mit einigen Auswahlreitern und Detailfenstern
im Detail. Die Definition der linksseitigen Auswahlreiter,
Menüstrukturen und Ereignisverknüpfungen ist
verallgemeinert und erfolgt vollständig mit Hilfe des Spring
Frameworks.
Vorschau - Komponenten
Generierte Beispieldialoge
Technologien & Bibliotheken
Lauffähig ab JDK 1.5
JDK 1.6 Swing Group Layout (portiert auf JDK 1.5)
[Link] (Login, SSO, Kommunikation, ...)
Springframework 2.x (Komposition, Konfiguration)
AOP, Remoting, JMX, JPA
Bushe EventBus (siehe JavaOne Präsentation)
Lf2prod & SwingX Komponenten (Filtertabellen, Panels, ...)
JGoodies Plastik Look & Feel als Basis für Erweiterungen
Glazed Lists
JUnit 3.x & 4.x als Testbasis
uispec4j & jemmy für Swing UI tests
hansel-2.x für junit Quellcode Abdeckungstests
Eigene Erweiterungen
Attributbindung & Validierung durch Annotationen
Formulardefinition / Autolayout durch Annotationen
Generelle Verwendung von Generics (Java 1.5)
Grafische Anpassungen am Look & Feel
Generische Swing Komponenten
Spring Integration / Komposition
Rendering & Binding
Die Darstellung von
Transferobjekten kann durch
die Verwendung eines frei
definierbaren Formular -
Models den jeweiligen
Bedürfnissen angepasst
werden. Bei Bedarf können
Formularobjekte mit
Datenobjekten gleichgesetzt
werden (1:1 Darstellung
eines Beans als Formular).
Bean Attribute werden durch
Annotationen einzelnen
Renderern, Validatoren und
Formatierern zugeordnet.
Rendering & Binding
Ein abstrakter Basisrenderer implementiert die
Verknüpfung zwischen dargestellter Swingkomponente
und den zugrundeliegenden Formularobjekten.
Reaktionen auf Benutzer Interaktionen sind in den
jeweiligen Feldkapselungen generisch abgebildet und
werden an das zugehörige Model weitergeleitet.
Der Entwickler hat bei bedarf vollständige Kontrolle über
alle Zeitpunkte einer jeweilige Persistierung bzw.
Weitergabe oder Zusammenführung geänderter
Attribute.
Rendering & Binding
Es können beliebige Swing Komponenten oder eigene
Erweiterungen zur Darstellung von Attributwerten
eingesetzt werden. Die übergeordnete
Renderkomponente delegiert die Darstellung eines
Attributes an die jeweilige Renderkomponente des
Attributes.
Automatische Layoutdefinition
A A : Anordnung zu Clustern
B : Feldbeschreibungen
C : Attributprüfung
D D : Formatierung und Prüfung
B
Die Definition der Oberfläche im Formularmodel und ist hier beispielhaft
A
für einige Standardannotationen dargestellt. Diese können beliebig um
eigene Aspekte erweitert werden.
D
Durch die Verwendung des Grouplayouts schrumpft die Auswertung der A
Annotationen und deren Darstellung in der generalisierten
Implementierung eines Formularpanels auf ca. 50 Quellcodezeilen.
Komplexere Zusammenstellungen wie zum Beispiel Mehrspaltigkeit können
bei Implementierung entsprechender Annotationen und deren
Berücksichtigung im Grouplayout umgesetzt werden.
C
Formatierung von Attributen
Beispiel für einen einfachen Text -
Formatierer. Die Formatierung
erfolgt in drei Phasen: Laden eines
Attributes, bei Nutzereingaben, und
bei der Übergabe an das
übergeordnete Vaterobjekt.
Validierung von Attributen
Analog zu Formatierung können
eigene Validierer für Attribute
implementiert werden. Die
Reihenfolge der Validierung erfolgt
ebenfalls in drei Phasen.
Eventsystem / EventBus
Als Basis für die Kommunikation aller Komponenten wird
anstatt eines HMVC Musters ein Eventsystem benutzt. Es
handelt sich hierbei um die Standardimplementierung von
Michael Bushe, welche im Swing Umfeld als eine der besten
Implementierungen gilt und zudem durch hohe Performance
heraussticht (siehe Präsentation Java One 2006).
Die Definition von Sendern und Empfängern erfolgt entweder
direkt bei der jeweiligen Komponente oder durch Softcoding
mit Hilfe des Springframeworks (Beispiel: Folie mit
Menüdefinitionen).
“Agents” EventBus
Navigation über Objektbäume / Eventsystem
EventBus
“Agents”
Beispiel für eine Steuerung des
Bearbeitungssystems zur Ansteuerung
von Objekten aus Arbeitslisten,
Suchergebnissen, Listen ...
Anwendungskomposition
In der Beispielanwendung werden alle
Konfigurierbaren Aspekte der Anwendung mit
Hilfe des Springframeworks konfiguriert.
Dieses bietet zu einem späteren Zeitpunkt
eine einfache Möglichkeit für Erweiterungen
wie zum Beispiel Logging, Eventinterceptionen
etc.
Generell ist jedoch das Springframework nicht
Voraussetzung und kann durch andere
Konfigurationsmechanismen oder eine rohe
Javaimplementierung ersetzt werden.
Komponentenkomposition
Beispiel der Komposition von Auswahlelementen.
Menükomposition
Definition der verfügbaren Menüaktionen (aktuell
nicht personalisiert) und deren Verknüpfung mit
dem Eventsystem. Die Definition der
Menüstrukturen werden analog vorgenommen.
Komponentenmanagement
Beispiel für die nachträgliche Bereitstellung
einzelner Komponenten durch JMX (zum Beispiel
für Serverpush einzelner Komponenteninhalte
etc.)
Resourcendefinition
Die Definition beliebiger Resourcen erfolgt
ebenso mit Spring (hier am Beispiel von
Ikondefinitionen).
Login als Implementierung des [Link] Standards
Beispiel für eine eigene Implementierung des [Link]
Beobachtungen, Fazit und Ausblick
Seit JDK 1.42 ist Swing sehr schnell und bei sorgfältiger Implementierung auch sehr
ressourcenverträglich. Es ist jedoch anzumerken, dass „native“ Anwendungen bei hoher
Auslastung des Clients immer noch performanter sind.
Grundlegende Swing API hat sich seit mehreren Jahren nur geringfügig verändert, auch
wenn die interne Implementierung seitens SUN mittlerweile sehr von den ersten Versionen
abweicht.
Simulationen mit 100+ dargestellten Bearbeitungsfenstern verursachen kaum merkliche
Verzögerungen.
Swing Oberflächen können mit geringem Aufwand „schön“ aussehen und entsprechen
aktuellen Anforderung der Nutzer. Eigene Komponenten überbieten sogar die Funktionalität
von Standardframeworks. Einziger ernsthafter Widersacher ist in dieser Hinsicht
wxWidgets.
Die Testbarkeit mit uispec4j. bzw. netbeans jemmy ermöglicht die vollständige
Testabdeckung im Entwicklungsprozess.
Die Qualität der Anwendung erfordern eine genaue Kenntnis der Swing Interna
(insbesondere Threading - Aspekte). Durch eine sorgfältige Implementierung und
Kapselung technischer Aspekte kann das Framework jedoch auch an unerfahrene
Anwendungsentwickler weitergereicht werden.