我正在努力从 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 中看到过类似的代码,但我的改编可能是错误的。
其他信息
我很困惑我的方法中是否存在错误,因为 unbindBi Direction()
也发生了类似的情况,或者可能这是一个错误,因为此功能可能不会被充分利用并且没有人注意到。
尝试使用调试器访问委托(delegate)
中的监听器,但它不显示任何字段。
为什么我需要这个
我有一个 View 显示一些insideProp:Property
,它是不同outsideProp:ObjectProperty [T]内的对象
。 content:T
的成员
但是,我不想显示特定的 content
的 insideProp
或 outsideProp
内的任何内容。为此,我需要一个可移动的绑定(bind),或一个可移动的事件监听器,因为 View 只能由 outsideProp
的当前内容修改。
我很乐意为每个内容
创建一个新的“不可变” View ,但是从经验来看JavaFX
并不是真正针对这种行为构建的,而且还存在一个问题内存泄漏。
我非常感谢有人指出我做错了什么。
最佳答案
添加监听器
在 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
关于scala - 从 ScalaFX 中的属性中删除监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40939466/