JavaFX 8 MapProperty unbind ne fonctionne pas?
Quelqu'un peut-il m'expliquer s'il s'agit d'un bogue ou s'il me manque quelque chose dans la liaison JavaFX MapProperty?
Scénario: Deux instances MapProperty-master et child.
- Au début, nous lions child à master
- Ensuite, nous stockons certaines valeurs dans master
- Dissocier l'enfant du maître
- Effacer l'enfant
- les deux instances sont vides - pourquoi?
- Stocke certaines valeurs dans l'enfant
- les deux instances contiennent les mêmes valeurs - Pourquoi?
Code:
public static void main(String[] args) {
MapProperty<String, Object> master = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
MapProperty<String, Object> child = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
child.bind(master);
master.put("k1", "v1");
System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("OS version : " + System.getProperty("os.name") + " - " + System.getProperty("os.arch"));
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
// Isn't this supposed to stop change listener ?????
child.unbind();
child.clear();
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
child.put("k2", "v2");
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
}
Sortie:
run:
Java version: 1.8.0_45
OS version : Windows 7 - amd64
------------
master: MapProperty [value: {k1=v1}]
child : MapProperty [bound, invalid]
------------
master: MapProperty [value: {}]
child : MapProperty [value: {}]
------------
master: MapProperty [value: {k2=v2}]
child : MapProperty [value: {k2=v2}]
BUILD SUCCESSFUL (total time: 0 seconds)
2
1 answers
La valeur d'une MapProperty est un ObservableMap, pas le contenu de l'ObservableMap.
Exécution de ce code
MapProperty<String, Object> master = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
MapProperty<String, Object> child = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
ObservableMap<String, Object> childMap = child.get();
ObservableMap<String, Object> masterMap = master.get();
System.out.println("before binding: " + ((childMap == masterMap) ? "childMap == masterMap" : "childMap != masterMap"));
child.bind(master);
childMap = child.get();
masterMap = master.get();
System.out.println("after binding: " + ((childMap == masterMap) ? "childMap == masterMap" : "childMap != masterMap"));
child.unbind();
System.out.println("after unbinding: " + ((childMap == masterMap) ? "childMap == masterMap" : "childMap != masterMap"));
Montre qu'après la liaison, ObservableMap dans child
et main
est le même objet, car la propriété enveloppe la carte et non son contenu:
before binding: childMap != masterMap
after binding: childMap == masterMap
after unbinding: childMap == masterMap
Pour lier le contenu de la carte, utilisez bindContent
à la place. Exécution
MapProperty<String, Object> master = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
MapProperty<String, Object> child = new SimpleMapProperty<String, Object>(
FXCollections.observableMap(new HashMap<String, Object>()));
child.bindContent(master);
master.put("k1", "v1");
System.out.println("Java version: " + System.getProperty("java.version"));
System.out.println("OS version : " + System.getProperty("os.name") + " - " + System.getProperty("os.arch"));
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
child.unbindContent(master);
child.clear();
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
child.put("k2", "v2");
System.out.println("------------");
System.out.println("master: " + master);
System.out.println("child : " + child);
Donne le résultat suivant:
Java version: 1.8.0_45
OS version : Windows 7 - amd64
------------
master: MapProperty [value: {k1=v1}]
child : MapProperty [value: {k1=v1}]
------------
master: MapProperty [value: {k1=v1}]
child : MapProperty [value: {}]
------------
master: MapProperty [value: {k1=v1}]
child : MapProperty [value: {k2=v2}]
1
Author: Modus Tollens, 2015-06-05 11:50:30