수색…


이벤트 리스너 추가

Preferences 오브젝트에 의해 NodeChangeEvent 되는 이벤트에는, PreferenceChangeEventNodeChangeEvent 의 2 종류가 있습니다.

PreferenceChangeEvent

PreferenceChangeEvent 는 노드의 키 - 값 쌍 중 하나가 변경 될 때마다 Properties 객체에 의해 생성됩니다. PreferenceChangeEvent 는, 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 노드의 자식 노드가 추가되거나 제거 될 때마다 발생합니다.

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 모든 인스턴스는 단일 JVM (Java Virtual Machine)의 스레드에서 항상 스레드로부터 안전합니다. Preferences 은 여러 JVM에서 공유 할 수 있으므로 가상 시스템간에 변경 사항을 동기화하는 특별한 방법이 있습니다.

단일 인스턴스 에서만 실행해야하는 응용 프로그램이있는 경우 외부 동기화 가 필요 하지 않습니다.

단일 시스템에서 여러 인스턴스 에서 실행되는 응용 프로그램을 가지고 있으므로 Preferences 액세스가 시스템의 JVM간에 조정되어야하는 경우 Preferences 노드의 sync() 메소드 를 사용하여 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 에서 내 보낸 지 여부를 기 o합니다.

단일 노드 만 내보내고 자식 노드는 내보내려면 다음을 수행하십시오.

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 트리로 다시 가져올 수 있습니다. 정적 함수는 사용자 또는 시스템 Preferences 에서 XML 문서를 내보냈는지 여부를 자동으로 찾아서 내보낼 트리로 자동으로 가져옵니다.

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 유형이 될 수 있습니다. 지정된 값이 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() 메소드 중 하나가 사용됩니다. Preferences 노드의 값은 String , boolean , byte[] , double , float , int 또는 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