9.21 Flexibles 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 das Look and Feel mit dem Namen Ocean (früher war es Metal). In Java 6 Update 10 gibt es ein neues LAF mit dem Namen Nimbus, 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
9.21.1 Look and Feel global setzen
Um für alle Java-Programme zentral ein LAF zu setzen, wird in das C:\Program Files\Java\ jdk1.6.0\jre\lib-Verzeichnis eine kleine Datei swing.properties gesetzt:
Listing 9.82: swing.properties
swing.defaultlaf=com.sun.java.swing.plaf.windows.WindowsLookAndFeel
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.
9.21.2 UIManager
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, sollten wir das Java-LAF in das System-LAF umschalten.
Der folgende Programmblock setzt mit setLookAndFeel() das Aussehen einer Oberfläche, wie sie das System vorgibt. Die Java-Programme sollten dann wie native Programme aussehen:
Listing 9.83: com/tutego/insel/ui/swing/SetLookAndFeel.java
package com.tutego.insel.ui.swing;
import javax.swing.*;
public class SetLookAndFeel
{
public static void main( String[] args )
{
try
{
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
// UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
}
catch ( Exception e )
{
e.printStackTrace();
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new JScrollPane( new JTree() ) );
frame.setSize( 200, 200 );
frame.setLocationRelativeTo( null );
frame.setVisible( true );
}
}
Ändern wir das Look and Feel (Nimbus ist seit Java 6 Update 10 im JDK mit dabei), sieht die Oberfläche anders aus. Stellen wir die drei Aussehen nebeneinander:
Abbildung 9.55: Standard-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.[74](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/.
class javax.swing.UIManager |
- 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:
SwingUtilities.updateComponentTreeUI( component );
Die component wird im Allgemeinen das Window (also JFrame/JWindow) sein.
9.21.3 Die Windows-Optik mit JGoodies Looks verbessern *
Zwar bemühte sich das JDK bis zur Version 6 bestmöglich, das Windows-XP-Look-and-Feel zu emulieren, doch das gelingt nicht an allen Stellen. Seit Java 6 nutzt das System den nativen Windows-Renderer, sodass Unstimmigkeiten eigentlich ausgeschlossen sein sollten. Verbesserungen lassen sich auch nicht so einfach publizieren, da die Release-Zyklen vom JDK lang sind. In diesem Fall hilft JGoodies Looks (https://looks.dev.java.net/), ein LAF unter der BSD-Lizenz. Das Ziel von Looks ist die perfekte Nachbildung des Aussehens für die Windows-Reihen 95/98/NT/ME/2000/2003/XP/Vista. 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:
try {
String laf =
LookUtils.IS_OS_WINDOWS_XP
? Options.getCrossPlatformLookAndFeelClassName()
: Options.getSystemLookAndFeelClassName();
UIManager.setLookAndFeel( laf );
} catch ( Exception e ) {
System.err.println( "Can't set look & feel:" + e );
}
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.