Themes. Skining. Look And Feels. Alle diese Schlagwörter meinen eigentlich dasselbe, nämlich einen Mechanismus, mit dem das Aussehen einzelner Oberflächenkomponenten einer Anwendung wie etwa Knöpfe, Eingabefelder, Listen an eine bestimmte Situation oder ein bestimmtes Thema angepasst werden kann. Glücklicherweise baute man in Java, genauer im Swing-Framework, von Anfang an auf dieses Konzept. So bringt Swing selbst bereits einige Look And Feels (LAFs) mit, die es ermöglichen, etwa das Aussehen einer Anwendung an ein bestimmtes Betriebssystem anzupassen. Daneben bringt Swing in unregelmäßigen Abständen immer wieder neue ansprechende Look and Feels (in Java 6 kam beispielsweise der Nebula-Look hinzu), und es besteht darüber hinaus ein API, mit dem eigene LAFs erstellt werden können. Da verwundert es auch kaum, dass in den letzten Jahren eine Vielzahl weiterer Themes entstanden sind - einige kostenpflichtig, andere frei verfügbar - mit denen man seine Swing-Anwendung meist mit wenig Aufwand an bestimmte Anforderungen anpassen oder modernisieren kann. Eine recht gute Übersicht derzeit verfügbarer LAFs findet sich hier [1].
Der psychologische Wohlfühlfaktor
Viele Entwickler argumentieren gerne, dass alleine die Funktion zählt und das Aussehen der Oberfläche doch eigentlich gar nicht wichtig sei. Dabei unterschätzt man oft den sogenannten "psychologischen Wohlfühlfaktor". Ein Anwender, der ein bestimmtes Programm den ganzen Tag benutzt (oder benutzen muss), soll sich im Programm wohlfühlen, denn was nützen noch so ausgefeilte Features, wenn die Oberfläche in altbackenem Windows 95-Stil gehalten ist, obwohl der Anwender bereits ein modernes und buntes Windows Vista und Office 2007 installiert hat? Ein Anwender wird sein Werkzeug nur dann gerne benutzen, wenn er sich zurechtfindet, wenn die verschiedenen Anwendungen, mit denen er täglich arbeitet, ansprechend aussehen und gleich bedienbar sind. Der Mensch ist halt ein "Gewohnheitstier", und gerade deshalb sollte man den psychologischen Wohlfühlfaktor nicht unterschätzen.
Das hat Substanz!
Das Substance-Projekt [2], welches auf java.net gehostet wird, erhebt für sich den Anspruch, eine stabile, schnelle und erweiterbare Bibliothek zur Verfügung zu stellen, mit der man visuell ansprechende und konsistente Swing-Anwendungen entwickeln kann. Dass es sich bei Substance um ein lebendiges Projekt handelt, zeigt der Blick auf die Versionshistorie. So gibt es das Projekt bereits seit dem Jahr 2005 und hat seitdem 15 Versionssprünge gemacht. Derzeit ist die Version 5.2 aktuell, die nur mit Java 6 lauffähig ist. In Abbildung 1 sieht man ein Fenster und wie dieses mit Substance ausgeschmückt werden kann. Substance liefert, wie bereits zu Beginn erwähnt, nicht nur eine Vielzahl vordefinierter, teilweise sogar animierter LAFs mit, es besteht darüber hinaus die Möglichkeit, durch sogenanntes "Skinning" entweder die bestehenden LAFs auf eigene Bedürfnisse anzupassen oder ganz neue Skins und LAFs zu entwerfen. Wer vor dem Ausprobieren noch mehr von Substance sehen will, dem sei die Demo-Anwendung auf der Projektseite empfohlen, die sich über Java WebStart [3] ganz bequem direkt aus dem Web starten lässt.
Vierundzwanzig
Nachdem man sichergestellt hat, dass sich substance.jar im Classpath befindet, stehen dem Entwickler gleich mehrere Möglichkeiten offen, Substance in der eigenen Anwendung zu verwenden. Entweder man startet Substance direkt über eine Variable, die man der VM wie folgt übergibt:-Dswing.defaultlaf=org.jvnet.substance.SubstanceLegacyDefaultLookAndFeel
Eine weitere Möglichkeit ist die Verwendung der Swing-Klasse UIManager zum Einstellen des gewünschten LAFs:
UIManager.setLookAndFeel(new SubstanceLegacyDefaultLookAndFeel()); UIManager.setLookAndFeel(“SubstanceLegacyDefaultLookAndFeel“);
Insgesamt werden mit Substance vierundzwanzig unterschiedliche LookAndFeel-Klassen mitgeliefert, die allesamt auf eine der vorgenannten Arten aktiviert werden können. Listing 1 enthält eine vollständige Auflistung der verfügbaren Klassen.
Listing 1:
org.jvnet.substance.SubstanceLegacyDefaultLookAndFeelorg.jvnet.substance.skin.SubstanceBusinessLookAndFeelorg.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeelorg.jvnet.substance.skin.SubstanceBusinessBlackSteelLookAndFeelorg.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeelorg.jvnet.substance.skin.SubstanceOfficeSilver2007LookAndFeelorg.jvnet.substance.skin.SubstanceMistAquaLookAndFeelorg.jvnet.substance.skin.SubstanceMistSilverLookAndFeelorg.jvnet.substance.skin.SubstanceModerateLookAndFeelorg.jvnet.substance.skin.SubstanceNebulaLookAndFeelorg.jvnet.substance.skin.SubstanceNebulaBrickWallLookAndFeelorg.jvnet.substance.skin.SubstanceRavenLookAndFeelorg.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeelorg.jvnet.substance.skin.SubstanceRavenGraphiteGlassLookAndFeelorg.jvnet.substance.skin.SubstanceCremeLookAndFeelorg.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeelorg.jvnet.substance.skin.SubstanceDustLookAndFeelorg.jvnet.substance.skin.SubstanceDustCoffeeLookAndFeelorg.jvnet.substance.skin.SubstanceSaharaLookAndFeelorg.jvnet.substance.skin.SubstanceTwilightLookAndFeelorg.jvnet.substance.skin.SubstanceEmeraldDuskLookAndFeelorg.jvnet.substance.skin.SubstanceMagmaLookAndFeelorg.jvnet.substance.skin.SubstanceChallengerDeepLookAndFeelorg.jvnet.substance.skin.SubstanceAutumnLookAndFeel
Während RavenGraphiteLookAndFeel einfach nur gut aussieht, sind insbesondere BusinessLookAndFeel und BusinessBlackSteelLookAndFeel aufgrund ihrer Schlichtheit für den Einsatz in Geschäftsanwendungen gut geeignet. Will man dagegen Anwendungen im Stile von Office 2007 bauen, dann lässt sich mit OfficeBlue2007LookAndFeel und OfficeSilver2007LookAndFeel bereits eine verblüffende Ähnlichkeit erreichen. Schmückt man seine Anwendung dann noch statt mit einer Toolbar mit einem modernen Ribbon (zum Beispiel mittels der Komponente aus dem Flamingo-Projekt) aus, dann darf sich die Anwendung zumindest designtechnisch in eine Reihe mit Word 2007 und Excel 2007 stellen. Will man seine Anwendung an unterschiedliche Betriebssysteme anpassen, etwa der unter Mac OS X verwendeten Aqua-Oberfläche, bietet sich MistAquaLookAndFeel an. Ganz neu hinzugekommen in Substance 5.2 ist mit DustLookAndFeel ein Skin, mit dem sich Swing-Anwendungen mühelos auf das unter Ubuntu populäre Dust-Theme umstellen lassen.
Sollte beim Einbinden von Substance eine Exception auftreten, die angibt, dass das entsprechende Look And Feel nicht geladen werden konnte (zum Beispiel java.lang.Error: Cannot load org.jvnet.substance.skin.SubstanceBusinessLookAndFeel), dann liegt das meist daran, dass sich die Datei substance.jar nicht im Classpath befindet. Wirft Substance dagegen eine UiThreadingViolationException, dann sollte man sein Programm dahingehend überprüfen, ob die Swing-Komponenten im sogenannten Event Dispatch Thread erzeugt werden. Mehr Hintergrundinformation zum Event Dispatch Thread (EDT), und wie man mit diesem umgeht, findet sich unter [4]. Listing 2 zeigt, wie eine einfache Swing-Applikation (Abbildung 1) unter Berücksichtigung von EDT programmiert und im Anschluss problemlos mit Substance zusammengebracht werden kann.
Listing 2
public class SampleApp extends JFrame {public SampleApp() {super("Sample app");this.setLayout(new FlowLayout());this.add(new JButton("button"));this.add(new JCheckBox("check"));this.add(new JLabel("label"));this.setSize(new Dimension(250, 80));this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true);SwingUtilities.invokeLater(new Runnable() {public void run() {SampleApp s = new SampleApp();s.setVisible(true);}});}}














