Sie sind auf Seite 1von 22

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)
 Javax.security (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 javax.security Standards

Beispiel für eine eigene Implementierung des javax.security.auth.spi.LoginModule


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.