CellCache在TableView中用tornadoFX意外渲染
我只是困惑于与Kotlin
的cellCache
函数的使用。 渲染总是奇怪而且意想不到,那会发生什么? 代码在这里:
data class Person(var name : String, var age : Int, var sex : Boolean) class MyView: View() { val list = listOf( Person("Name A", 20, false), Person("Name B", 22, false), Person("Name C", 21, true), Person("Name D", 30, true), Person("Name E", 35, true) ).observable() override val root = stackpane { vbox { tableview(items = list) { column("Name", Person::name) column("Age", Person::age) column("Sex", Person::sex).cellCache{ checkbox{ isSelected = it setOnAction { println("Selection: $isSelected") } } } } } } }
我希望所有的行都会在"Sex"
列中显示一个checkbox
,但是上面的代码只会显示两个:一个selected
,另一个unselected
,这个cellcache
到底在cellcache
什么? 我也发现改变data class
与下面的一个,这是正确的:
data class Person(var name : String, var age : Int, var sex : SimpleBooleanProperty)
不过,我必须用这种方式改变数据类属性,我也不知道为什么。 帮助我,并提前感谢!
cellCache
在列表中为每个项目创建一个唯一的单元格。 如果您的项目没有实现有意义的equals
和hashCode
函数,那么您将遇到cellCache
问题,因为同一个单元格将用于多个基础项目。
添加equals
和hashCode
实现,确保每个项目是唯一的应该解决问题。 似乎Kotlin数据类中的默认实现不会削减它:)
如果你不能或不会提供equals
和hashCode
实现,我会建议使用cellFormat
来代替,它不依赖于对象相等来产生一个唯一的单元格。
对不起,这在指南中没有说清楚,我将更新TableView部分,提供更多信息并警告使用cellCache
。