以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] {
^
有什么想法吗?
更新:我已使用ObservableValue
将javafx.beans.value.ObservableValue
(已被解析为我不太了解的ScalaFX版本)替换为已解决的错误。它现在编译并抛出任何错误,但仍然无法正常工作 - 代码永远不会被调用。
答案 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)
}
})
注意匿名类必须完全定义类型参数,而不是重写方法。