CellCache неожиданно появляется в TableView с tornadoFX

Я просто озадачил использование TornadoFX в TornadoFX с Kotlin . Вывод всегда странный и неожиданный, что с ним происходит? Код находится здесь:

 data class Person(var name : String, var age : Int, var sex : Boolean) class MyView: View() { val list = listOf<Person>( 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") } } } } } } } 

Я ожидаю, что все строки будут отображаться с помощью checkbox в столбце "Sex" , но в приведенном выше коде будет отображаться только два: один selected и другой unselected , что, черт возьми, происходит с cellcache ? Я также вижу изменение data class с приведенным ниже, и все в порядке:

 data class Person(var name : String, var age : Int, var sex : SimpleBooleanProperty) 

Однако я должен многое изменить с помощью свойств класса данных таким образом, я также не знаю, почему. Помогите мне, и спасибо заранее!

cellCache создает уникальную ячейку для каждого элемента в вашем списке. Если ваши объекты не реализуют значащие функции equals и hashCode вас cellCache проблемы с cellCache поскольку cellCache та же ячейка будет использоваться для нескольких базовых элементов.

Добавление решения equals и hashCode которое гарантирует, что каждый элемент уникален, должен решить проблему. Кажется, что реализация по умолчанию в классе данных Kotlin не режет ее 🙂

Если вы не можете или не будете предоставлять equals и hashCode реализации, я бы предложил вместо этого использовать cellFormat , который не полагается на равенство объектов для создания уникальной ячейки.

Простите, что это не разъясняется в руководстве, я обновляю часть TableView с дополнительной информацией и предупреждением об использовании cellCache .