15.28 Flexibles Java-Look&Feel
 
Das Aussehen der Komponenten 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 & Feel mit dem Namen »Ocean« (früher »Metal« ).
15.28.1 UIManager
 
Das L&F von Applikationen lässt sich zur Laufzeit ändern. Dazu müssen wir nur eine statische Methode der Klasse UIManager aufrufen, die sich um das Aussehen der Programme kümmert. Hier ist es die spezielle Methode setLookAndFeel(), die als Argument einen Klassennamen erwartet. Verschiedene Methoden sind vordefiniert, mit denen wir das Java-eigene L&F und das System-L&F einstellen können. Da Benutzer von Java-Programmen im Allgemeinen eine Systemoberfläche erwarten, sollten wir das Java-L&F nach dem Erzeugen des Fensters umschalten.
public class UIManager
implements Serializable
|
|
static LookAndFeel getLookAndFeel()
Gibt das aktuelle L&F zurück. |
|
static String getSystemLookAndFeelClassName()
Gibt das aktuelle L&F zurück. |
|
static String getCrossPlatformLookAndFeelClassName()
Liefert den Namen der Klassen für das System-L&F. |
|
static void setLookAndFeel( String className )
throws ClassNotFoundException, InstantiationException, IllegalAccessException,
UnsupportedLookAndFeelException
Setzt ein neues L&F. |
Die folgenden Zeilen zeigen, wie sich das Aussehen der Oberfläche durch die Methode setLookAndFeel() ändern lässt. Der folgende Programmblock ändert das Aussehen einer Oberfläche so, wie es das System vorgibt. Die Programme sehen dann wie native Programme aus.
static void setNativeLookAndFeel()
{
try {
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName() );
} catch( Exception e ) { e.printStackTrace(); }
}
Die nächste Zeile erzeugt das plattformunabhängige Java-L&F:
UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
Plattformabhängiges Java-L&F muss als Klasse eingebunden werden, die Motif-Oberfläche etwa mit folgender Zeile:
UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel" );
Einige spezielle L&F sind nicht auf jeder Architektur erlaubt. So verbietet Apple ihr eigenes L&F auf Plattformen anderer Hersteller.1
Dennoch lässt sich das Aqua-L&F installieren, in den Pfad integrieren und dann als com.apple.mrj.swing.MacLookAndFeel einbinden. Weitere Infos dazu bietet die Web-Seite http://www.ing.unitn.it/~luttero/javaonMac/.
Listing 15.44
LookAndFeel.java
import javax.swing.*;
public class LookAndFeel
{
public static void main( String[] args ) throws Exception
{
//UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
//UIManager.setLookAndFeel( "javax.swing.plaf.metal.MetalLookAndFeel" );
//UIManager.setLookAndFeel( "com.l2fprod.gui.plaf.skin.SkinLookAndFeel" );
//UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.add( new JButton( "Ask Dr. Bob" ) );
frame.pack();
frame.setVisible( true );
}
}
15.28.2 Ändern des Aussehens Laufzeit
 
Das Setzen eines L&Fs mit setLookAndFeel() führt zu keinem Neuzeichnen der Komponenten. Wird das neue L&F 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 Methode:
SwingUtilities.updateComponentTreeUI( component );
Die component wird im Allgemeinen das Window (also JFrame/JWindow) sein.
Ein Problem ergibt sich, wenn der Frame noch Window-Objekte erzeugt, da diese immer Kinder eines Fensters sind; Änderungen des L&Fs müssen an diese Kinder weitergegeben werden. Dazu erfragen wir zuerst alle Fenster über die statische Funktion Frame.getFrames(). Anschließend laufen wir alle Fenster ab und von ihnen die Windows.
for ( Frame f : Frame.getFrames() )
{
SwingUtilities.updateComponentTreeUI( f );
for ( Window w : f.getOwnedWindows() )
SwingUtilities.updateComponentTreeUI( w );
}
15.28.3 Verbessern des Aussehens unter Windows mit WinLAF
 
Zwar versucht Sun immer perfekter, das Windows XP Look and Feel zu emulieren, doch an allen Stellen gelingt das nicht. Verbesserungen lassen sich auch nicht so einfach publizieren, da Sun an die Release-Zyklen des SDK gebunden ist. Ein LaF-Verbesserer ist winlaf (Windows Look and Feel Fidelity) unter https://winlaf.dev.java.net/. Ihr Zusatz patcht die Sun-Quellen, um ein anständigeres XP-Look and Feel zu erreichen. Dabei werden unter anderem Pixel hinzugefügt, Fonts ausgelesen (über eine DLL), der Fokus passend gesetzt und Menüs überarbeitet. Gesetzt wird WinLAF wie jedes andere Look-And-Feel:
try
{
UIManager.setLookAndFeel( "net.java.plaf.windows.WindowsLookAndFeel" );
}
catch( Exception e )
{
System.out.println( "Error setting native LAF: " + e );
}
1 Apple betrachtete die Windows-Version 2.1 als Look-And-Feel-Clone und verklagte Microsoft ab 1988 wegen Urheberrechtsverletzungen auf eine Summe von über fünf Milliarden US-Dollar. 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.
|