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]

根据文档,我真的不明白这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]

长答案的简短版本:在使用原始 Java 类型(如 boolean 或 int)时,Scala 和 Java 之间存在某些“摩擦”。这种不便体现在 ScalaFX 的属性绑定中。并非所有东西都以直观的方式继承。在这种情况下

ReadOnlyBooleanWrapper 

是一个子类

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

scala.Boolean不是java.lang.Boolean内部的子类,在 ScalaFX 中这会导致复杂化。有趣的是,转换.asInstanceOf[ObservableValue[scala.Boolean, scala.Boolean]]工作,尽管类型参数在编译时不匹配。

感谢您提供完整的代码示例(要点),这确实有助于澄清问题。

于 2014-02-18T03:18:31.103 回答