Java Language
Inställningar
Sök…
Lägga till evenemangets lyssnare
Det finns två typer av händelser som avges av ett Preferences
: PreferenceChangeEvent
och NodeChangeEvent
.
PreferenceChangeEvent
Ett PreferenceChangeEvent
släpps ut av ett Properties
objekt varje gång en av nodens nyckelvärde-par ändras. PreferenceChangeEvent
s kan lyssnas på med en 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();
}
});
Den här lyssnaren lyssnar inte på ändrade nyckelvärdespar av barnnoder.
NodeChangeEvent
Denna händelse kommer att avfyras när en barnnod i en Properties
nod läggs till eller tas bort.
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();
}
});
Skaffa undernoder av inställningar
Preferences
representerar alltid en specifik nod i ett helt Preferences
, typ av så här:
/userRoot
├── com
│ └── mycompany
│ └── myapp
│ ├── darkApplicationMode=true
│ ├── showExitConfirmation=false
│ └── windowMaximized=true
└── org
└── myorganization
└── anotherapp
├── defaultFont=Helvetica
├── defaultSavePath=/home/matt/Documents
└── exporting
├── defaultFormat=pdf
└── openInBrowserAfterExport=false
För att välja noden /com/mycompany/myapp
:
Enligt konvention, baserat på paketet i en klass:
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());
Av relativ väg:
Preferences myApp = Preferences.userRoot().node("com/mycompany/myapp");
Om du använder en relativ sökväg (en sökväg som inte börjar med a /
) kommer det att lösa banan i förhållande till den överordnade noden den löses på. Till exempel kommer följande exempel att returnera noden för sökvägen /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
Av absolut väg:
Preferences myApp = Preferences.userRoot().node("/com/mycompany/myapp");
Att använda en absolut sökväg på rotnoden skiljer sig inte från att använda en relativ sökväg. Skillnaden är att om den anropas till en undernod kommer banan att lösas relativt rotnoden.
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
Samordna preferenser åtkomst över flera applikationsinstanser
Alla instanser av Preferences
är alltid trådsäkra över trådarna på en enda Java Virtual Machine (JVM). Eftersom Preferences
kan delas över flera JVM, finns det speciella metoder som hanterar synkronisering av förändringar mellan virtuella maskiner.
Om du har en applikation som endast ska köras i en enda instans krävs ingen extern synkronisering .
Om du har en applikation som körs i flera instanser på ett enda system och därför måste Preferences
koordineras mellan JVM: erna på systemet, kan sync()
för alla Preferences
användas för att säkerställa att ändringar i Preferences
är synlig för andra JVM: er på systemet:
// 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();
}
Exportera inställningar
Preferences
kan exporteras till ett XML-dokument som representerar den noden. Det resulterande XML-trädet kan importeras igen. Den resulterande XML-dokument kommer ihåg om det exporterades från användar- eller Preferences
.
Så här exporterar du en enda nod, men inte dess underordnade noder :
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) {}
}
}
Så här exporterar du en enda nod med sina barnnoder :
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) {}
}
}
Importerar preferenser
Preferences
kan importeras från ett XML-dokument. Importering är tänkt att användas i samband med Exportfunktionaliteten i Preferences
, eftersom det skapar rätt motsvarande XML-dokument.
De XML-dokument kommer att minnas om de exporterades från användar- eller Preferences
. Därför kan de importeras till sina respektive Preferences
igen, utan att du behöver ta reda på eller veta var de kommer ifrån. Den statiska funktionen automatiskt ta reda på om XML-dokumentet exporterades från användar- eller Preferences
och kommer automatiskt att importera dem till trädet de exporterades från.
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) {}
}
}
Ta bort evenemangets lyssnare
Event lyssnare kan tas bort igen från alla Properties
, men lyssnarens instans måste hållas kvar för det.
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);
Detsamma gäller för NodeChangeListener
.
Få preferensvärden
Ett värde på en Preferences
kan vara av typen String
, boolean
, byte[]
, double
, float
, int
eller long
. Alla kallelser måste tillhandahålla ett standardvärde, om det angivna värdet inte finns i noden 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);
Ställa in preferensvärden
För att lagra ett värde i noden Preferences
används en av putXXX()
-metoderna. Ett värde på en Preferences
kan vara av typen String
, boolean
, byte[]
, double
, float
, int
eller 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);
Med hjälp av preferenser
Preferences
kan användas för att lagra användarinställningar som återspeglar en användares personliga applikationsinställningar, t.ex. deras redigeringssnitt, oavsett om de föredrar att applikationen ska startas i helskärmsläge, om de markerade kryssrutan "Visa inte detta igen" och saker sådär.
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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow