Java Language
設定
サーチ…
イベントリスナーの追加
Preferences
オブジェクトによってNodeChangeEvent
されるイベントには、 PreferenceChangeEvent
とNodeChangeEvent
2種類があります。
PreferenceChangeEvent
ノードのキーと値のペアのいずれかが変更されるたびに、 Properties
オブジェクトによってPreferenceChangeEvent
が送出されProperties
。 PreferenceChangeEvent
は、 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();
}
});
このリスナーは、変更された子ノードのキーと値のペアをリッスンしません。
NodeChangeEvent
このイベントは、 Properties
ノードの子ノードが追加または削除されるたびに発生しProperties
。
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();
}
});
環境設定のサブノードを取得する
Preferences
オブジェクトは、常にPreferences
ツリー全体の中の特定のノードを表します。
/userRoot
├── com
│ └── mycompany
│ └── myapp
│ ├── darkApplicationMode=true
│ ├── showExitConfirmation=false
│ └── windowMaximized=true
└── org
└── myorganization
└── anotherapp
├── defaultFont=Helvetica
├── defaultSavePath=/home/matt/Documents
└── exporting
├── defaultFormat=pdf
└── openInBrowserAfterExport=false
/com/mycompany/myapp
ノードを選択するには:
慣例により、クラスのパッケージに基づいて:
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());
相対パス別:
Preferences myApp = Preferences.userRoot().node("com/mycompany/myapp");
相対パス( /
始まらないパス)を使用すると、解決された親ノードを基準にしてパスが解決されます。たとえば、次の例では、パス/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
絶対パスによる:
Preferences myApp = Preferences.userRoot().node("/com/mycompany/myapp");
ルートノードで絶対パスを使用することは、相対パスを使用することと異なることはありません。相違点は、サブノードで呼び出された場合、ルートノードに対して相対パスが解決されることです。
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
複数のアプリケーションインスタンスにわたる環境設定の調整
Preferences
すべてのインスタンスは、単一のJava仮想マシン(JVM)のスレッド間で常にスレッドセーフです。 Preferences
は複数のJVMで共有できるため、仮想マシン間で変更を同期させる特別な方法があります。
単一のインスタンスでのみ実行されるはずのアプリケーションがある場合 、 外部同期は必要ありません 。
単一のシステムに複数のインスタンスで実行され、したがって、アプリケーションている場合Preferences
アクセスは、システム上のJVM間で調整する必要があるが、その後、 sync()
任意の方法 Preferences
ノードは、変更を保証するために使用することができるPreferences
ノードでありますシステム上の他のJVMから見える:
// 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();
}
環境設定のエクスポート
Preferences
ノードは、そのノードを表すXML文書にエクスポートできます。結果のXMLツリーを再度インポートできます。結果のXML文書は、ユーザーまたはシステムの「 Preferences
からエクスポートされたかどうかを覚えています。
単一のノードをエクスポートするが、その子ノードはエクスポートしない :
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) {}
}
}
子ノードを持つ単一のノードをエクスポートするには:
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) {}
}
}
環境設定のインポート
Preferences
ノードはXML文書からインポートできます。インポートは、適切な対応するXMLドキュメントを作成するため、 Preferences
のエクスポート機能と併用することを前提としています。
XML文書は、それらがユーザーまたはシステムの「 Preferences
からエクスポートされたかどうかを覚えています。したがって、彼らはどこから来たのか把握することなく、それぞれのPreferences
ツリーに再度インポートすることができます。静的関数は、XML文書がユーザーまたはシステムPreferences
からエクスポートされたかどうかを自動的に検出し、エクスポートされたツリーに自動的にインポートします。
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) {}
}
}
イベントリスナーの削除
イベントリスナーは、任意のProperties
ノードから再度削除できますが、リスナーのインスタンスを保持する必要があります。
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);
NodeChangeListener
も同様です。
設定値を取得する
Preferences
ノードの値は、 String
型、 boolean
、 byte[]
、 double
、 float
、 int
またはlong
いずれかにlong
ます。指定された値が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);
設定値の設定
Preferences
ノードに値を格納するには、 putXXX()
メソッドの1つが使用されます。 Preferences
ノードの値は、 String
型、 boolean
、 byte[]
、 double
、 float
、 int
またはlong
いずれかに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);
環境設定の使用
Preferences
を使用して、ユーザーの個人的なアプリケーション設定、例えばエディタフォント、アプリケーションをフルスクリーンモードで起動するかどうか、「これをもう一度表示しない」チェックボックス、そうですね。
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
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow