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] {
                                          ^

何か案は?

更新: ObservableValue(よくわからない ScalaFX バージョンに解決されていた) を に置き換えることでエラーを解決しましたjavafx.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 に答える