如何在ScalaFX中正确声明属性更改侦听器?

时间:2014-05-02 15:40:29

标签: scala scalafx

this code为例,我编写了以下内容来跟踪滑块的变化,并将结果放入"速度:Int"变量:

speedSlider.valueProperty.addListener(new ChangeListener[Number] {
  @Override
  def changed(o: ObservableValue[_ <: Number], oldVal: Number, newVal: Number) {
    speed = newVal.intValue()
  }
})

但它会导致错误:

wrong number of type arguments for scalafx.beans.value.ObservableValue, should be 2
  def changed(o: ObservableValue[_ <: Number], oldVal: Number, newVal: Number) {

如果我将ObservableValue[_ <: Number]更改为ObservableValue[_ <: Number, _ <: Number],则此错误会消失,但会出现另一个错误:

object creation impossible, since method changed in trait ChangeListener of type (x$1: javafx.beans.value.ObservableValue[_ <: Number], x$2: Number, x$3: Number)Unit is not defined
speedSlider.valueProperty.addListener(new ChangeListener[Number] {
                                          ^

有什么想法吗?

更新:我已使用ObservableValuejavafx.beans.value.ObservableValue(已被解析为我不太了解的ScalaFX版本)替换为已解决的错误。它现在编译并抛出任何错误,但仍然无法正常工作 - 代码永远不会被调用。

2 个答案:

答案 0 :(得分:3)

查看docs我发现您不需要传递ChangeListener,只需传递一个与onChange方法具有相同签名的匿名函数

speedSlider.valueProperty.addListener{ (o: javafx.beans.value.ObservableValue[_ <: Number], oldVal: Number, newVal: Number) =>
  speed = newVal.intValue
}

否则该方法将需要javafx.beans.value.ChangeListener

我希望这能解决问题。

答案 1 :(得分:0)

以防万一其他人遇到此问题。使用 Scala 3,以下工作:

        rotate.statusProperty().addListener(new ChangeListener[Animation.Status]() {
            override def changed(observableValue: ObservableValue[ _ <: Animation.Status],
                                oldValue: Animation.Status, newValue: Animation.Status) = {
                text2.setText("Was - " + oldValue + ", Now - " + newValue)

            }
        })

注意匿名类必须完全定义类型参数,而不是重写方法。