我正在努力从ScalaFX中的Property
删除事件监听器。
简化示例
import scalafx.Includes._
object ListenerApp {
val prop = DoubleProperty(0)
val listener = (source, oldValue, newVal) => {
println("Listener working, and the value is " + newVal)
}
def main(args: Array[String]) = {
prop.addListener(listener)
prop.value = 1
prop.removeListener(listener)
prop.value = 2
}
}
结果与预期不符:
Listener working, and the value is 1.0
Listener working, and the value is 2.0
我在JavaFX中看到了类似的代码工作但是我的改编可能是错误的。
添加国家信息
我很困惑我的方法中是否存在错误,因为unbindBidirectional()
发生了类似的事情,或者它可能是一个错误,因为此功能可能没有得到太多利用而且没有人注意到
尝试使用调试器访问delegate
中的侦听器,但它不显示任何字段。
为什么我甚至需要这个
我有一个视图显示一些insideProp: Property
,它是另一个content: T
内的对象outsideProp: ObjectProperty[T]
的成员。
但是,我不想显示特定content
insideProp
或outsideProp
内的任何内容。为此,我需要一个可移动的绑定或一个可移动的事件监听器,因为视图只能由outsideProp
的当前内容修改。
我很乐意创造一个新的"不变的"查看每个content
,但是从经验JavaFX
来讲,并不是真的为此行为构建,并且还存在内存泄漏问题。
我非常感谢有人指出我做错了什么。
答案 0 :(得分:2)
在ScalaFX中添加属性侦听器的惯用方法是使用
onChange
方法:
val prop = DoubleProperty(0)
prop.onChange { (source, oldValue, newValue) =>
println(s"Property $source changed value from $oldValue to $newValue")
}
如果您只想要新值,可以忽略前两个参数:
prop.onChange { (_, _, newValue) =>
println(s"Property changed value to $newValue")
}
订阅句柄可让您删除侦听器。 为添加到属性的每个侦听器创建订阅。 当你不再需要倾听时,你会取消"订阅:
val prop = DoubleProperty(0)
val subscription = prop.onChange { (_, _, newValue) =>
println(s"Property changed value to $newValue")
}
prop.value = 1
subscription.cancel()
// Listener will not be notified about this change
prop.value = 2