Java Language
voorkeuren
Zoeken…
Gebeurtenisluisteraars toevoegen
Er zijn twee typen gebeurtenissen uitgezonden door een Preferences
object: PreferenceChangeEvent
en NodeChangeEvent
.
PreferenceChangeEvent
Een PreferenceChangeEvent
wordt uitgezonden door een object Properties
telkens wanneer een van de sleutel / waarde-paren van het knooppunt verandert. PreferenceChangeEvent
s kan worden beluisterd met een PreferenceChangeListener
:
preferences.addPreferenceChangeListener(evt -> {
String newValue = evt.getNewValue();
String changedPreferenceKey = evt.getKey();
Preferences changedNode = evt.getNode();
});
preferences.addPreferenceChangeListener(new PreferenceChangeListener() {
@Override
public void preferenceChange(PreferenceChangeEvent evt) {
String newValue = evt.getNewValue();
String changedPreferenceKey = evt.getKey();
Preferences changedNode = evt.getNode();
}
});
Deze luisteraar luistert niet naar gewijzigde sleutel / waarde-paren onderliggende knooppunten.
NodeChangeEvent
Deze gebeurtenis wordt geactiveerd wanneer een kindknooppunt van een Properties
wordt toegevoegd of verwijderd.
preferences.addNodeChangeListener(new NodeChangeListener() {
@Override
public void childAdded(NodeChangeEvent evt) {
Preferences addedChild = evt.getChild();
Preferences parentOfAddedChild = evt.getParent();
}
@Override
public void childRemoved(NodeChangeEvent evt) {
Preferences removedChild = evt.getChild();
Preferences parentOfRemovedChild = evt.getParent();
}
});
Subknooppunten van voorkeuren verkrijgen
Preferences
vertegenwoordigen altijd een specifiek knooppunt in een hele Preferences
, ongeveer zo:
/userRoot
├── com
│ └── mycompany
│ └── myapp
│ ├── darkApplicationMode=true
│ ├── showExitConfirmation=false
│ └── windowMaximized=true
└── org
└── myorganization
└── anotherapp
├── defaultFont=Helvetica
├── defaultSavePath=/home/matt/Documents
└── exporting
├── defaultFormat=pdf
└── openInBrowserAfterExport=false
Om het /com/mycompany/myapp
knooppunt te selecteren:
Volgens afspraak, op basis van het pakket van een klasse:
package com.mycompany.myapp;
// ...
// Because this class is in the com.mycompany.myapp package, the node
// /com/mycompany/myapp will be returned.
Preferences myApp = Preferences.userNodeForPackage(getClass());
Op relatief pad:
Preferences myApp = Preferences.userRoot().node("com/mycompany/myapp");
Als u een relatief pad gebruikt (een pad dat niet begint met een /
), wordt het pad opgelost ten opzichte van het bovenliggende knooppunt waarop het is opgelost. In het volgende voorbeeld wordt bijvoorbeeld het knooppunt van het pad /one/two/three/com/mycompany/myapp
:
Preferences prefix = Preferences.userRoot().node("one/two/three");
Preferences myAppWithPrefix = prefix.node("com/mycompany/myapp");
// prefix is /one/two/three
// myAppWithPrefix is /one/two/three/com/mycompany/myapp
Op absoluut pad:
Preferences myApp = Preferences.userRoot().node("/com/mycompany/myapp");
Het gebruik van een absoluut pad op het hoofdknooppunt verschilt niet van het gebruik van een relatief pad. Het verschil is dat, als het op een subknooppunt wordt aangeroepen, het pad ten opzichte van het hoofdknooppunt wordt opgelost.
Preferences prefix = Preferences.userRoot().node("one/two/three");
Preferences myAppWitoutPrefix = prefix.node("/com/mycompany/myapp");
// prefix is /one/two/three
// myAppWitoutPrefix is /com/mycompany/myapp
Coördinerende voorkeuren toegang over meerdere applicatie-instanties
Alle instanties van Preferences
zijn altijd thread-safe over de threads van een enkele Java Virtual Machine (JVM). Omdat Preferences
kunnen worden gedeeld over meerdere JVM's, zijn er speciale methoden voor het synchroniseren van wijzigingen tussen virtuele machines.
Als u een toepassing hebt die alleen in één exemplaar moet worden uitgevoerd, is geen externe synchronisatie vereist.
Als u een toepassing hebt die in meerdere exemplaren op één systeem wordt uitgevoerd en daarom de toegang van Preferences
moet worden gecoördineerd tussen de JVM's op het systeem, dan kan de methode sync()
van elk knooppunt Preferences
worden gebruikt om te zorgen dat wijzigingen in het knooppunt Preferences
zijn zichtbaar voor andere JVM's op het systeem:
// Warning: don't use this if your application is intended
// to only run a single instance on a machine once
// (this is probably the case for most desktop applications)
try {
preferences.sync();
} catch (BackingStoreException e) {
// Deal with any errors while saving the preferences to the backing storage
e.printStackTrace();
}
Voorkeuren exporteren
Preferences
kunnen worden geëxporteerd naar een XML-document dat dat knooppunt vertegenwoordigt. De resulterende XML-structuur kan opnieuw worden geïmporteerd. De resulterende XML-document zal herinneren of het werd geëxporteerd vanuit de gebruiker of het systeem Preferences
.
Om een enkel knooppunt te exporteren, maar niet de onderliggende knooppunten :
Java SE 7 try (OutputStream os = ...) {
preferences.exportNode(os);
} catch (IOException ioe) {
// Exception whilst writing data to the OutputStream
ioe.printStackTrace();
} catch (BackingStoreException bse) {
// Exception whilst reading from the backing preferences store
bse.printStackTrace();
}
Java SE 7 OutputStream os = null;
try {
os = ...;
preferences.exportSubtree(os);
} catch (IOException ioe) {
// Exception whilst writing data to the OutputStream
ioe.printStackTrace();
} catch (BackingStoreException bse) {
// Exception whilst reading from the backing preferences store
bse.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException ignored) {}
}
}
Om een enkel knooppunt met zijn onderliggende knooppunten te exporteren:
Java SE 7 try (OutputStream os = ...) {
preferences.exportNode(os);
} catch (IOException ioe) {
// Exception whilst writing data to the OutputStream
ioe.printStackTrace();
} catch (BackingStoreException bse) {
// Exception whilst reading from the backing preferences store
bse.printStackTrace();
}
Java SE 7 OutputStream os = null;
try {
os = ...;
preferences.exportSubtree(os);
} catch (IOException ioe) {
// Exception whilst writing data to the OutputStream
ioe.printStackTrace();
} catch (BackingStoreException bse) {
// Exception whilst reading from the backing preferences store
bse.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException ignored) {}
}
}
Voorkeuren importeren
Preferences
kunnen worden geïmporteerd uit een XML-document. Importeren is bedoeld om te worden gebruikt in combinatie met de exportfunctionaliteit van Preferences
, omdat hiermee de juiste bijbehorende XML-documenten worden gemaakt.
De XML-documenten zullen herinneren of zij werden uitgevoerd door de gebruiker of het systeem Preferences
. Daarom kunnen ze opnieuw in hun respectieve Preferences
worden geïmporteerd, zonder dat u hoeft te achterhalen of waar ze vandaan komen. De statische functie wordt automatisch erachter te komen of het XML-document van de gebruiker of het systeem werd geëxporteerd Preferences
en zal ze automatisch te importeren in de boom werden ze uit geëxporteerd.
Java SE 7 try (InputStream is = ...) {
// This is a static call on the Preferences class
Preferences.importPreferences(is);
} catch (IOException ioe) {
// Exception whilst reading data from the InputStream
ioe.printStackTrace();
} catch (InvalidPreferencesFormatException ipfe) {
// Exception whilst parsing the XML document tree
ipfe.printStackTrace();
}
Java SE 7 InputStream is = null;
try {
is = ...;
// This is a static call on the Preferences class
Preferences.importPreferences(is);
} catch (IOException ioe) {
// Exception whilst reading data from the InputStream
ioe.printStackTrace();
} catch (InvalidPreferencesFormatException ipfe) {
// Exception whilst parsing the XML document tree
ipfe.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException ignored) {}
}
}
Gebeurtenisluisteraars verwijderen
Luisteraars van gebeurtenissen kunnen weer uit elk knooppunt Properties
worden verwijderd, maar daarvoor moet de instantie van de luisteraar worden bewaard.
Java SE 8 Preferences preferences = Preferences.userNodeForPackage(getClass());
PreferenceChangeListener listener = evt -> {
System.out.println(evt.getKey() + " got new value " + evt.getNewValue());
};
preferences.addPreferenceChangeListener(listener);
//
// later...
//
preferences.removePreferenceChangeListener(listener);
Java SE 8 Preferences preferences = Preferences.userNodeForPackage(getClass());
PreferenceChangeListener listener = new PreferenceChangeListener() {
@Override
public void preferenceChange(PreferenceChangeEvent evt) {
System.out.println(evt.getKey() + " got new value " + evt.getNewValue());
}
};
preferences.addPreferenceChangeListener(listener);
//
// later...
//
preferences.removePreferenceChangeListener(listener);
Hetzelfde geldt voor NodeChangeListener
.
Voorkeurswaarden verkrijgen
Een waarde van een Preferences
kan van het type String
, boolean
, byte[]
, double
, float
, int
of long
. Alle aanroepen moeten een standaardwaarde bieden, voor het geval dat de opgegeven waarde niet aanwezig is in het knooppunt Preferences
.
Preferences preferences = Preferences.userNodeForPackage(getClass());
String someString = preferences.get("someKey", "this is the default value");
boolean someBoolean = preferences.getBoolean("someKey", true);
byte[] someByteArray = preferences.getByteArray("someKey", new byte[0]);
double someDouble = preferences.getDouble("someKey", 887284.4d);
float someFloat = preferences.getFloat("someKey", 38723.3f);
int someInt = preferences.getInt("someKey", 13232);
long someLong = preferences.getLong("someKey", 2827637868234L);
Voorkeuren instellen
Als u een waarde in het knooppunt Preferences
wilt opslaan, wordt een van de methoden putXXX()
gebruikt. Een waarde van een Preferences
kan van het type String
, boolean
, byte[]
, double
, float
, int
of long
.
Preferences preferences = Preferences.userNodeForPackage(getClass());
preferences.put("someKey", "some String value");
preferences.putBoolean("someKey", false);
preferences.putByteArray("someKey", new byte[0]);
preferences.putDouble("someKey", 187398123.4454d);
preferences.putFloat("someKey", 298321.445f);
preferences.putInt("someKey", 77637);
preferences.putLong("someKey", 2873984729834L);
Voorkeuren gebruiken
Preferences
kunnen worden gebruikt om gebruikersinstellingen op te slaan die de persoonlijke applicatie-instellingen van een gebruiker weerspiegelen, bijv. Hun editorlettertype, of ze liever hebben dat de applicatie op volledig scherm wordt gestart, of dat ze een "niet meer tonen" aanvinkvakje en dergelijke aanvinken zoals dat.
public class ExitConfirmer {
private static boolean confirmExit() {
Preferences preferences = Preferences.userNodeForPackage(ExitConfirmer.class);
boolean doShowDialog = preferences.getBoolean("showExitConfirmation", true); // true is default value
if (!doShowDialog) {
return true;
}
//
// Show a dialog here...
//
boolean exitWasConfirmed = ...; // whether the user clicked OK or Cancel
boolean doNotShowAgain = ...; // get value from "Do not show again" checkbox
if (exitWasConfirmed && doNotShowAgain) {
// Exit was confirmed and the user chose that the dialog should not be shown again
// Save these settings to the Preferences object so the dialog will not show again next time
preferences.putBoolean("showExitConfirmation", false);
}
return exitWasConfirmed;
}
public static void exit() {
if (confirmExit()) {
System.exit(0);
}
}
}
Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow