3

errorFixedにタイプのテーブル列があります。私のクラスには、この表の列に入れようとする があります。TableColumn[Error, Boolean]TableView[Error]Errorval fixed: Boolean

私は試した

errorFixed.cellValueFactory = features => 
  ReadOnlyBooleanWrapper(features.value.fixed)

しかし、それは失敗します

type mismatch;
found   : scalafx.beans.property.ReadOnlyBooleanWrapper
required: scalafx.beans.value.ObservableValue[Boolean,Boolean]

documentation によるとObservableValue[Boolean,Boolean]、のスーパータイプであるため、私は本当に理解していません。ReadOnlyBooleanWrapper

自分でキャストする.asInstanceOf[ObservableValue[Boolean, Boolean]]とうまくいくようです。ここで何が起こっているのですか?

再現するためにプロジェクトを簡素化した要点

4

1 に答える 1

3

簡単な答えは次のとおりです。代わりに

errorFixed.cellValueFactory = features => 
  ReadOnlyBooleanWrapper(features.value.fixed)

あなたが使用する必要があります

errorFixed.cellValueFactory = features => 
  ObjectProperty[Boolean](features.value.fixed)

またはReadOnlyObjectWrapper[Boolean]

長い回答の簡単なバージョン: boolean や int などのプリミティブな Java 型を扱う場合、Scala と Java の間には特定の「摩擦」があります。この不都合は、ScalaFX のプロパティ バインディングに現れます。すべてが直感的に継承されるわけではありません。この場合

ReadOnlyBooleanWrapper 

のサブクラスです

ObservableValue[scala.Boolean, java.lang.Boolean]

scala.Boolean内部的にはそのサブクラスではありませんが、java.lang.BooleanScalaFX ではこれが複雑化につながります。興味深いことに.asInstanceOf[ObservableValue[scala.Boolean, scala.Boolean]]、型パラメーターはコンパイル時に一致しませんが、キャストは機能します。

完全なコード例 (要点) を提示していただきありがとうございます。これは質問を明確にするのに本当に役立ちます。

于 2014-02-18T03:18:31.103 に答える