Der Umgang mit dem Preferences-API wird im Folgenden am Beispiel eines einfachen
Editors beschrieben. Beim Start lädt der Editor Fensterposition, -größe und
Font-Einstellungen. Der Anwender hat anschließend die Möglichkeit, diese Einstellungen
zu ändern, bevor sie beim Beenden des Programms wieder zurückgeschrieben werden.
Das initiale Laden der Einstellungen wird über folgenden Code realisiert:
void setPreferences() {
// Ermitteln des zuständigen Knotens
Preferences prefs;
prefs = Preferences.userNodeForPackage(getClass());
// Setzen der Fenster-Größe (Default: 400x450)
setSize(prefs.getInt("width", 400),
prefs.getInt("height", 450));
// Setzen der Position (Default: 0,0)
setLocation(prefs.getInt("xpos", 0),
prefs.getInt("ypos", 0));
// Setzen des Font-Namens
String fontName = prefs.get("font-name", "Default");
comboFontName.setSelectedItem(fontName);
// Setzen der Font-Größe
int fontSize = prefs.getInt("font-size", 12);
comboFontSize.setSelectedItem(""+fontSize);
// Font anwenden
editor.setFont(new Font(fontName, Font.PLAIN,
fontSize));
}
Dabei wird zunächst über die Methode userNodeForPackage(Class)
ein Exemplar der Klasse Preferences ermittelt.
Die Methode bekommt eine
Klasse übergeben und liefert einen Einstellungsknoten zurück, in dem die Einstellungen
zur übergebenen Klasse und dem gerade angemeldeten Benutzer abgelegt werden können.
Durch Aufruf der Methode systemNodeForPackage(Class) kann man auf den
entsprechenden Knoten im Systembereich zugreifen.
Der relevante Knoten wird ausgehend vom Wurzelknoten über einen eindeutigen Pfad
identifiziert. Der verwendete Pfad wird beim Aufruf der Methoden
NodeForPackage(Class) automatisch aus
dem vollqualifizierten Klassennamen der übergebenen Klasse ermittelt, d. h. im Beispiel
wird auf den Knoten
/de/dpunkt/prefs/SimplePrefDemo
zugegriffen, weil das Class-Exemplar der Klasse
de.dpunkt.prefs.SimplePrefDemo
übergeben wurde.
Alternativ dazu kann man einen Knoten auch direkt über seinen absoluten Pfad
oder relativ zu einem anderen Knoten ermitteln.
Über Preferences-Exemplare kann man anschließend Einstellungen abfragen und
setzen.
Im obigen Beispiel würde das bedeuten, dass man zunächst den Wurzelknoten ermittelt und
anschließend über den Pfad auf den Knoten zugreifen kann. Somit
würden folgende Zeilen zum selben Ergebnis führen:
Preferences userRootNode = Preferences.userRoot();
Preferences prefs prefs.node("/de/dpunkt/prefs/SimplePrefDemo");
Prinzipiell wird ein Knoten immer vorher angelegt, falls er zum Zeitpunkt des Zugriffs noch
nicht existiert, so dass beim Aufruf stets ein Knoten zurückgeliefert wird.
Im Beispiel werden die ermittelten Einstellungen sofort in der Benutzeroberfläche
eingestellt. Wenn man die Anwendung ordnungsgemäß beendet, werden die geänderten
Einstellungen über einen Shutdown-Hook wieder in den Benutzerbereich
zurückgeschrieben:
void storePreferences() throws BackingStoreException {
// Ermitteln des zuständigen Knotens
Preferences prefs =
Preferences.userNodeForPackage(getClass());
// Speichern der Fenster-Position
prefs.putInt("xpos", getLocation().x);
prefs.putInt("ypos", getLocation().y);
// Speichern der Fenster-Größe
prefs.putInt("width", getSize().width);
prefs.putInt("height", getSize().height);
// Speichern der Font-Einstellungen
prefs.put("font-name",
comboFontName.getSelectedItem().toString());
prefs.put("font-size",
comboFontSize.getSelectedItem().toString());
// Zur Sicherheit alles zurückschreiben
prefs.flush();
}
Im Prinzip wird nach demselben Schema verfahren wie beim Auslesen, statt der
get() werden jedoch put()-Methoden benutzt.
Zum Schluss werden die Einstellungen durch Aufruf von flush()
persistent gespeichert. Dem plattformspezifischen Speicherungsmechanismus steht es frei,
auch bereits vor dem Aufruf von flush() Veränderungen zu sichern,
es ist jedoch nicht vorgeschrieben. Da beim Aufruf von flush() alle
gepufferten Änderungen in jedem Fall zurückschrieben werden, ist man hiermit auf
der sicheren Seite.
Material zum Beispiel