gpt4 book ai didi

JavaFX 8 MapProperty 解除绑定(bind)不起作用?

转载 作者:行者123 更新时间:2023-11-30 11:02:45 25 4
gpt4 key购买 nike

谁能解释一下这是一个错误还是我在 JavaFX MapProperty 绑定(bind)中遗漏了什么?

场景:两个 MapProperty 实例 - 主实例和子实例。

  1. 首先,我们将 child 绑定(bind)到 master
  2. 然后我们在 master 中存储一些值
  3. 解除子进程与master的绑定(bind)
  4. 清楚的 child
  5. 两个实例都是空的 - 为什么?
  6. 在 child 中存储一些值
  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)

最佳答案

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

显示绑定(bind)后,childmain 中的 ObservableMap 是同一个对象,因为属性包装了 map 而不是它的内容:

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

要绑定(bind) map 的内容,请改用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}]

关于JavaFX 8 MapProperty 解除绑定(bind)不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30663093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com