scala - 从 ScalaFX 中的属性中删除监听器

标签 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 中看到过类似的代码,但我的改编可能是错误的。

其他信息

我很困惑我的方法中是否存在错误,因为 unbindBi Direction() 也发生了类似的情况,或者可能这是一个错误,因为此功能可能不会被充分利用并且没有人注意到。

尝试使用调试器访问委托(delegate)中的监听器,但它不显示任何字段。

为什么我需要这个

我有一个 View 显示一些insideProp:Property,它是不同outsideProp:ObjectProperty [T]内的对象content:T的成员

但是,我不想显示特定的 contentinsidePropoutsideProp 内的任何内容。为此,我需要一个可移动的绑定(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/

相关文章:

scala - Scala中最简单的过程通讯形式

scala-guice 和辅助注入(inject)

scala - Source.fromFile 的效率

macos - 在 OS X 上为 Java 7u7(包含 JavaFX 2.2)编译 scalafx

scala - 在 ScalaFX 中更改散点图绘图点的大小和符号

mysql - 通讯链路故障; Heroku 上的 Spray.io 以及 ClearDB 附加组件

java - 我无法连接到 docker 中的 rabbitmq 服务器

scala - 奇怪的类型不匹配错误

ScalaFx:具有一流功能的事件处理程序

ScalaFX:如何将图像对象转换为字节数组