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

Я просто озадачен cellCache использование функции в 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)

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

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам