[英]How to declare a property change listener in ScalaFX properly?
Using this code as an example I have written the following to track changes of a slider and put the result into the "speed: Int" variable:使用此代码作为示例,我编写了以下内容来跟踪滑块的变化并将结果放入“speed:Int”变量中:
speedSlider.valueProperty.addListener(new ChangeListener[Number] {
@Override
def changed(o: ObservableValue[_ <: Number], oldVal: Number, newVal: Number) {
speed = newVal.intValue()
}
})
But it causes an error:但它会导致错误:
wrong number of type arguments for scalafx.beans.value.ObservableValue, should be 2
def changed(o: ObservableValue[_ <: Number], oldVal: Number, newVal: Number) {
If I change ObservableValue[_ <: Number]
to ObservableValue[_ <: Number, _ <: Number]
this error disappears but another emerges:如果我将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] {
^
Any ideas?有任何想法吗?
Update: I have resolved the errors by replacing ObservableValue
(which was being resolved into the ScalaFX version which I don't really understand) with javafx.beans.value.ObservableValue
.更新:我已经解决了通过更换错误ObservableValue
(这是被分解为ScalaFX版本,我真的不明白)与javafx.beans.value.ObservableValue
。 It compiles and throws no errors now, but still doesn't work - the code is never invoked.它现在编译并不会抛出任何错误,但仍然不起作用 - 代码从未被调用。
Looking at the docs I see you don't need to pass a ChangeListener
but simply an anonymous function with the same signature as the onChange
method查看文档,我看到您不需要传递ChangeListener
而只需传递与onChange
方法具有相同签名的匿名函数
speedSlider.valueProperty.addListener{ (o: javafx.beans.value.ObservableValue[_ <: Number], oldVal: Number, newVal: Number) =>
speed = newVal.intValue
}
Otherwise the method will expect a javafx.beans.value.ChangeListener
否则该方法将需要一个javafx.beans.value.ChangeListener
I hope this solves the issue.我希望这能解决问题。
Just in case someone else encounters this problem.以防万一其他人遇到这个问题。 With Scala 3 the following works:使用 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)
}
})
Notice that the anonymous class must have the type parameter fully defined, but not the overridden method.请注意,匿名类必须具有完全定义的类型参数,而不是重写的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.