在ScalaFX中从属性中删除侦听器

时间:2016-12-02 19:17:00

标签: scala scalafx

我正在努力从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 insidePropoutsideProp内的任何内容。为此,我需要一个可移动的绑定或一个可移动的事件监听器,因为视图只能由outsideProp的当前内容修改。

我很乐意创造一个新的"不变的"查看每个content,但是从经验JavaFX来讲,并不是真的为此行为构建,并且还存在内存泄漏问题。

我非常感谢有人指出我做错了什么。

1 个答案:

答案 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