0

这是 Pro ScalaFX 的一个示例:

package proscalafx.ch03

import scalafx.beans.property.StringProperty

object BidirectionalBindingExample extends App {
  println("Constructing two StringProperty objects.")
  val prop1 = new StringProperty("")
  val prop2 = new StringProperty("")

  println("Calling bindBidirectional (<==>).")
  prop2 <==> prop1

  println("prop1.isBound = " + prop1.isBound)
  println("prop2.isBound = " + prop2.isBound)

  println("Calling prop1.set(\"prop1 says: Hi!\")")
  prop1() = "prop1 says: Hi!"
  println("prop2.get returned:")
  println(prop2())

  println( """Calling prop2.set(prop2.get + "\nprop2 says: Bye!")""")
  prop2() = prop2() + "\nprop2 says: Bye!"
  println("prop1.get returned:")
  println(prop1())
}

这两个StringProperty对象应该相互绑定,当其中一个被更新时,另一个也应该被更新。这不是真的:

Constructing two StringProperty objects.
Calling bindBidirectional (<==>).
prop1.isBound = false
prop2.isBound = false
Calling prop1.set("prop1 says: Hi!")
prop2.get returned:
prop1 says: Hi!
Calling prop2.set(prop2.get + "\nprop2 says: Bye!")
prop1.get returned:
prop1 says: Hi!
prop2 says: Bye!
4

1 回答 1

1

这段代码没有问题。prop1并且prop2是双向绑定的。当您查看您提供的输出时,情况显然如此。当值prop1设置为“prop1 说:嗨!” 改变它的价值prop2也是如此,当你改变时,它prop2就会prop1改变。请仔细查看输出。

可能令人困惑的一件事是isBound返回false两个属性。这是双向绑定的正确行为。isBound只有当一个属性单向绑定到另一个时才会返回 true。因此,如果您将代码更改为:

prop2 <== prop1
println("prop1.isBound = " + prop1.isBound)
println("prop2.isBound = " + prop2.isBound)

你会得到

prop1.isBound = false
prop2.isBound = true

这就是 JavaFX 的工作方式,与 ScalaFX 无关。

于 2015-09-20T03:42:07.540 回答