There are two types of events emitted by a [Preferences](<https://docs.oracle.com/javase/8/docs/api/java/util/prefs/Preferences.html>) object: [PreferenceChangeEvent](<https://docs.oracle.com/javase/8/docs/api/java/util/prefs/PreferenceChangeEvent.html>) and [NodeChangeEvent](<https://docs.oracle.com/javase/8/docs/api/java/util/prefs/NodeChangeEvent.html>).

PreferenceChangeEvent

A PreferenceChangeEvent gets emitted by a Properties object every time one of the node’s key-value-pairs changes. PreferenceChangeEvents can be listened for with a [PreferenceChangeListener](<https://docs.oracle.com/javase/8/docs/api/java/util/prefs/PreferenceChangeListener.html>):

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();
    }
});

This listener will not listen to changed key-value pairs of child nodes.

NodeChangeEvent

This event will be fired whenever a child node of a Properties node is added or removed.

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();
    }
});