10.23Flexibles Java-Look-and-Feel
Das Aussehen und Verhalten der Komponenten, in Java Look-and-Feel (LAF) genannt, lässt sich frei bestimmen und erzeugt so bei jedem Benutzer auf seiner Architektur die Illusion, es wäre eine plattformabhängige Applikation. Das Programm gliedert sich hinsichtlich des Aussehens in die anderen Programme ein und fällt nicht als Fremdling auf. Standardmäßig begegnet uns ein Look-and-Feel mit dem Namen Ocean (früher war es Metal). Java 6 Update 10 führte ein neues LAF mit dem Namen Nimbus ein, das aber dennoch nicht das Standard-LAF ist, sondern dies ist weiterhin Ocean.
Um das Aussehen von Java-Applikationen zu ändern, gibt es eine Reihe von Möglichkeiten:
beim Programmstart einen Schalter setzen
eine Konfigurationsdatei in das lib-Verzeichnis setzen
im Java-Programm von Hand das LAF verändern
10.23.1Look-and-Feel global setzen
Um für alle Java-Programme zentral ein LAF zu setzen, wird in das Verzeichnis C:\Program Files\Java\ jdk1.8.0\jre\lib eine neue Datei swing.properties gesetzt:
Listing 10.82swing.properties
Der Schalter swing.defaultlaf bestimmt die Klasse für das LAF, in unserem Fall Windows. Automatisch nehmen alle gestarteten Java-Programme dieses Standard-LAF an – es sei denn, sie setzen es wieder im Programm um. Das zeigen die folgenden Abschnitte.
10.23.2UIManager
Um das LAF von Applikationen zur Laufzeit zu ändern, müssen wir nur die statische Methode setLookAndFeel(…) der Klasse UIManager aufrufen. Die Klasse kümmert sich um das Aussehen der Java-Programme und bietet verschiedene Methoden, mit denen wir die Klassennamen vom Java-eigenen LAF und vom System-LAF erfragen können. Der Klassenname ist wichtig, denn er muss setLookAndFeel(…) als Argument übergeben werden. Da Benutzer von Java-Programmen im Allgemeinen eine Oberfläche erwarten, die genauso aussieht wie der Rest ihres Systems, sollten wir das Java-LAF in das System-LAF umschalten.
Der folgende Programmblock setzt mit setLookAndFeel(String) das Aussehen einer Oberfläche, wie sie das System vorgibt. Die Java-Programme sollten dann wie native Programme aussehen:
Listing 10.83com/tutego/insel/ui/swing/SetLookAndFeel.java, main()
// UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel" );
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
// UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
// UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
}
catch ( ClassNotFoundException | InstantiationException |
IllegalAccessException | UnsupportedLookAndFeelException e ) {
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new JButton( "Ask Dr. Bob" ) );
frame.pack();
frame.setVisible( true );
Ändern wir das Look-and-Feel etwa auf Nimbus, sieht die Oberfläche anders aus. Stellen wir die drei »Looks« nebeneinander:
Abbildung 10.69Standard-Look-and-Feel (Ocean), System-Look-and-Feel und Nimbus
Einige spezielle LAFs sind nicht auf jeder Architektur erlaubt. So verbietet Apple sein eigenes LAF auf Plattformen anderer Hersteller.[ 103 ](Apple betrachtete die Windows-Version 2.1 als Look-and-Feel-Clone und verklagte Microsoft ab 1988 wegen Urheberrechtsverletzungen auf eine Summe von über 5 Milliarden US-$. Letztendlich bekam Apple aber nichts; das Verfahren wurde 1997 eingestellt. 1989 klagte Xerox gegen Apple und beanspruchte das Urheberrecht an grafischen Oberflächen für sich.) Dennoch lässt sich das Aqua-LAF installieren, in den Pfad integrieren und dann als com.apple.mrj.swing.MacLookAndFeel einbinden. Weitere Infos dazu bietet die Webseite http://www.ing.unitn.it/~luttero/javaonMac/.
implements Serializable
static LookAndFeel getLookAndFeel()
Gibt das aktuelle LAF zurück.static String getSystemLookAndFeelClassName()
Gibt das LAF des aktuellen Fenstersystems zurück.static String getCrossPlatformLookAndFeelClassName()
Liefert den Namen der Klassen für das systemunabhängige LAF.static void setLookAndFeel(String className)
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException
Setzt ein neues LAF.
Ändern des Aussehens zur Laufzeit
Das Setzen eines LAFs mit setLookAndFeel(…) führt zu keinem Neuzeichnen der Komponenten. Wird das neue LAF gesetzt, bevor Swing die Komponenten darstellen muss, fällt das nicht auf. Mit dargestellten Komponenten müssen wir jedoch das Neuzeichnen anstoßen. Dazu dient die statische Methode:
Die component wird im Allgemeinen das Window (also JFrame/JWindow) sein.
[zB]Beispiel
Aktualisiere alle Fenster mit einem neuen Look-and-Feel:
Listing 10.84com/tutego/insel/ui/swing/SetLookAndFeel2.java, Ausschnitt
SwingUtilities.updateComponentTreeUI( f );
for ( Window w : f.getOwnedWindows() )
SwingUtilities.updateComponentTreeUI( w );
}
10.23.3Die Windows-Optik mit JGoodies Looks verbessern *
Zwar bemüht sich das JDK bestmöglich das Windows-Look-and-Feel zu emulieren, doch das gelingt nicht an allen Stellen. Selbst bei dem aktuellen JDK ist das noch nicht perfekt, wobei die Implementierung unter Windows auf den nativen Windows-Renderer zurückgreift. Und kleine Verbesserungen lassen sich auch nicht so einfach publizieren, da die Release-Zyklen vom JDK lang sind. In diesem Fall hilft JGoodies Looks (http://www.jgoodies.com/freeware/libraries/looks/), ein freies Look-and-Feel unter der BSD-Lizenz. Das Ziel von Looks ist die perfekte Nachbildung des Aussehens für alle Windows-Versionen. Gegenüber dem Windows-Look-and-Feel vom JDK korrigiert es viele Feinheiten, wie passende Insets bei Eingabefeldern, Icons, Farben, Rahmen, den richtigen Font, Menüeigenschaften, Auflösungen von 96 und 120 dpi und vieles mehr. Gesetzt wird Looks wie jedes andere LAF:
String laf = Options.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel( laf );
} catch ( Exception e ) {
System.err.println( "L&F lässt sich nicht initialisieren: " + e );
}