Wie können die Standard-Werte eines Look And Feel ausgelesen werden?

Die Erscheinung eines Desktop-Programms folgt einem sog. Look And Feel, d.h., dass für Ränder, Farben, Hintergründe, etc. vorgegebene Werte verwendet werden. Diese Werte können ermittelt werden, z.B. um sie an einer gewünschten Stelle zu verwenden.

Java kennt die Klasse UIDefaults , die von Hashtable abgeleitet ist und Standardeinstellungen für Swing-Komponenten definiert. Über die Klasse UIManager kann hierauf zugegriffen werden. Die statische Methode UIManager.getLookAndFeelDefaults() liefert ein Objekt der Klasse UIDefaults , das wie eine gängige Hashtable ausgelesen werden kann: Die Methode keySet() liefert ein Set der Schlüssel, über die iteriert werden kann. Hierzu wird in einer Schleife mittels hasNext() geprüft, ob das Iterator-Objekt weitere Einträge registriert hat. Ist dies der Fall, wird der jeweils nächste Schlüssel mittels next() ausgelesen. Über diesen wird das zugehörige Object aus der Map der UIDefaults ausgelesen.
Im Beispiel werden in der Folge alle definierten Color -Objekte ermittelt. Dies geschieht mit Hilfe der Methode getColor() , die in der Klasse UIDefaults deklariert ist.

import java.awt.Color;
import java.util.Iterator;
import java.util.Set;

import javax.swing.UIDefaults;
import javax.swing.UIManager;

public class LookAndFeelDefaults {
    public static void main(String[] argv) {
        UIDefaults def = UIManager.getLookAndFeelDefaults();
        Set<Object> keySet = def.keySet();
        Iterator<Object> iter = keySet.iterator();
        while (iter.hasNext()) {
            Object key = iter.next();
            Object obj = def.get(key);
            if (obj instanceof Color) {
                Color c = def.getColor(key);
                System.out.println("Key: " + key + ", Object: " + c);
            }
        }
    }
}

Die Klasse stellt eine Reihe derartiger Methoden zum Auslesen der gespeicherten Objekte zur Verfügung, sodass durch einfaches Ersetzen dieser Methode andere Objekte ermittelt werden können:

//...
if (obj instanceof Border) {
    Border b = def.getBorder(key);
	System.out.println("Key: " + key + ", Object: " + b);
}
//...