サーチ…


イベントリスナーの追加

PreferencesオブジェクトによってNodeChangeEventされるイベントには、 PreferenceChangeEventNodeChangeEvent 2種類があります。

PreferenceChangeEvent

ノードのキーと値のペアのいずれかが変更されるたびに、 PropertiesオブジェクトによってPreferenceChangeEventが送出されPropertiesPreferenceChangeEventは、 PreferenceChangeListener聴くことができます:

Java SE 8
preferences.addPreferenceChangeListener(evt -> {
    String newValue = evt.getNewValue();
    String changedPreferenceKey = evt.getKey();
    Preferences changedNode = evt.getNode();
});
Java SE 8
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ノードを選択するには:

  1. 慣例により、クラスのパッケージに基づいて:

    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());
    
  2. 相対パス別:

    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
    
  3. 絶対パスによる:

    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型、 booleanbyte[]doublefloatintまたは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型、 booleanbyte[]doublefloatintまたは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