Artikel

 
August 2009 | Artikel

Swing mit Substanz

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2494)

Das Substance Look And Feel für Swing

Text: Marc Teufel
Look And Feels für Java gibt es viele. In diesem Artikel stellt JAXenter Substance vor, eine Bibliothek, mit der die Oberflächen eigener Swing-Anwendungen näher in die Welt von Ubuntu, Microsoft Vista, Office 2007 und Co. gebracht werden kann.
Teil 1   Teil 2   Teil 3   

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:
  1. org.jvnet.substance.SubstanceLegacyDefaultLookAndFeel
  2. org.jvnet.substance.skin.SubstanceBusinessLookAndFeel
  3. org.jvnet.substance.skin.SubstanceBusinessBlueSteelLookAndFeel
  4. org.jvnet.substance.skin.SubstanceBusinessBlackSteelLookAndFeel
  5. org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel
  6. org.jvnet.substance.skin.SubstanceOfficeSilver2007LookAndFeel
  7. org.jvnet.substance.skin.SubstanceMistAquaLookAndFeel
  8. org.jvnet.substance.skin.SubstanceMistSilverLookAndFeel
  9. org.jvnet.substance.skin.SubstanceModerateLookAndFeel
  10. org.jvnet.substance.skin.SubstanceNebulaLookAndFeel
  11. org.jvnet.substance.skin.SubstanceNebulaBrickWallLookAndFeel
  12. org.jvnet.substance.skin.SubstanceRavenLookAndFeel
  13. org.jvnet.substance.skin.SubstanceRavenGraphiteLookAndFeel
  14. org.jvnet.substance.skin.SubstanceRavenGraphiteGlassLookAndFeel
  15. org.jvnet.substance.skin.SubstanceCremeLookAndFeel
  16. org.jvnet.substance.skin.SubstanceCremeCoffeeLookAndFeel
  17. org.jvnet.substance.skin.SubstanceDustLookAndFeel
  18. org.jvnet.substance.skin.SubstanceDustCoffeeLookAndFeel
  19. org.jvnet.substance.skin.SubstanceSaharaLookAndFeel
  20. org.jvnet.substance.skin.SubstanceTwilightLookAndFeel
  21. org.jvnet.substance.skin.SubstanceEmeraldDuskLookAndFeel
  22. org.jvnet.substance.skin.SubstanceMagmaLookAndFeel
  23. org.jvnet.substance.skin.SubstanceChallengerDeepLookAndFeel
  24. org.jvnet.substance.skin.SubstanceAutumnLookAndFeel
Listing 1: Vierundzwanzig LookAndFeel-Klassen liefert Substance in der Version 5.2

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
  1. public class SampleApp extends JFrame {
  2. public SampleApp() {
  3. super("Sample app");
  4. this.setLayout(new FlowLayout());
  5. this.add(new JButton("button"));
  6. this.add(new JCheckBox("check"));
  7. this.add(new JLabel("label"));
  8. this.setSize(new Dimension(250, 80));
  9. this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10. }
  11. public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true);
  12. SwingUtilities.invokeLater(new Runnable() {
  13. public void run() {
  14. SampleApp s = new SampleApp();
  15. s.setVisible(true);
  16. }
  17. });
  18. }
  19. }
Listing 2 : Swing-Beispielanwendung unter Berücksichtigung von Event Dispatch Thread

Teil 1   Teil 2   Teil 3   

Anzeige

Kommentare

Gravatar RPR 18.08.2009
um 21:41 Uhr
Vielen Dank für diesen informativen Artikel!:-) #zitieren
Gravatar Aljoscha Rittner 19.08.2009
um 07:51 Uhr
Moin!

Der Artikel und die Arbeit eines Freundes brachten mich dazu ein Substance Plugin für die NetBeans Platform zu entwickeln. Das Substance-Team hat ja ihr eigenes Plugin für NB aufgegeben. Zusätzlich wird der Einstaz erschwert, weil hard-coded eine Exception wirft, wenn man nicht im EDT das GUI erzeugt oder ändert (siehe Infos hier: http://www.pushing-pixels.org/?p=368). Ich bin zwar auch für ein Early-Fail, aber hard-coded hat man bei so großen Anwendungen wie NetBeans kaum eine Chance überhaupt aus den Sumpf der Stacktraces herauszukommen, um irgendwas zu fixen. Es wäre schön gewesen, wenn man dazu ein Legacy-Flag gehabt hätte. So musste ich die Substance-Sourcen patchen.
Ich werde mich aber dafür einsetzen, dass mal ein Blick auf die Problembereiche geworfen werden, so dass in Zukunft Substance ungepatcht auf mit NetBeans und der NetBeans Platform läuft. Hier das Plugin: http://tinyurl.com/substancenbplugin

Toni Epple (ebenfals NB Dream Team Member und Consulter) arbeitet parallel an Verbesserungen, damit wir in NB UI-Delegates haben. Damit können dann Tab und andere spezielle Swing-Komponenten besser von den Skins manipuliert werden.

Beste Grüße,
Josch.
#zitieren
Gravatar Toni Epple 19.08.2009
um 23:18 Uhr
Hallo Marc, danke für den guten Artikel.
Substance ist wirklich eines der besten Swing Look & Feels.

Hi Josch, als ich das "Moin!" in den Kommentaren gelesen habe, war mir schon klar, wer hier schreibt ;-). Ich bin schon gespannt auf die nächsten News zu Deinem Projekt! Ich werde auch mein bestes versuchen damit NetBeans 6.8 wieder mehr Substanz erhält...

--Toni
#zitieren
Gravatar Claudi 09.02.2010
um 16:55 Uhr
Hi,
erstmal vielen Dank für diesen informativen Artikel.
Ich hab bzw. sagen wir mal wollt nachdem ich das gelesen hatte mit Flamingo arbeiten. Bin aber leider nicht weit gekommen. Im Prinzip, um es kurz zu machen möchte ich auf diese Weise jemanden suchen der mir zu dem Thema ein bisschen was erklären kann. Wenn sich irgendwer dazu bereit erklärt, kann er/sie sich ja bei mir unter sulli@spamavert.com melden (werde in nächster Zeit die Spamadresse täglich checken).
#zitieren

Anzeige

zurück zum Seitenanfang