2

这段代码为例,我编写了以下代码来跟踪滑块的变化并将结果放入“speed: 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. 它现在编译并且没有抛出任何错误,但仍然无法工作 - 代码永远不会被调用。

4

2 回答 2

4

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

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

否则该方法将期望一个javafx.beans.value.ChangeListener

我希望这能解决问题。

于 2014-05-03T07:40:51.940 回答
2

以防万一其他人遇到这个问题。使用 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)

            }
        })

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

于 2021-07-24T16:03:01.220 回答