2

これがバグなのか、それともJavaFX MapPropertyバインディングに何か欠けているのか、誰か説明してもらえますか?

シナリオ: 2 つの MapProperty インスタンス - マスターと子。

  1. まず、子をマスターにバインドします
  2. 次に、いくつかの値をマスターに保存します
  3. 子をマスターからバインド解除
  4. クリア子
  5. 両方のインスタンスが空です - なぜですか?
  6. いくつかの値を子に格納する
  7. 両方のインスタンスに同じ値が含まれています - なぜですか?

コード:

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

}

出力:

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)
4

1 に答える 1

1

MapProperty の値は、ObservableMap のコンテンツではなく、ObservableMap です。

このコードの実行

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"));   

プロパティはコンテンツではなくマップをラップするため、バインド後、 と の両方の ObservableMap が同じオブジェクトであることchildを示しています。main

before binding: childMap != masterMap
after binding: childMap == masterMap
after unbinding: childMap == masterMap

マップのコンテンツをバインドするには、bindContent代わりに使用します。実行中

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

次の結果が得られます。

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}]
于 2015-06-05T11:50:30.193 に答える