【问题标题】:CellCache renders unexpectedly in TableView with tornadoFXCellCache 使用 tornadoFX 在 TableView 中意外呈现
【发布时间】:2017-02-23 16:34:53
【问题描述】:

我只是对TornadoFXKotlin 中的cellCache 函数用法感到困惑。渲染总是奇怪和出乎意料的,会发生什么?代码在这里:

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")
                        }
                    }
                }
            }
        }
    }
}

我希望所有行都会在"Sex" 列中呈现checkbox,但上面的代码只会显示两个:一个selected 和另一个unselectedcellcache 到底是怎么回事? 我还发现把data class改成下面的,就可以了:

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

但是我必须以这种方式对数据类属性进行很多更改,我也不知道为什么。 帮助我,在此先感谢!

【问题讨论】:

  • 对不起,Person 类的最后一个代码不应该使用数据类,而是使用普通类前缀。这有效:class Person(var name : String, var age : Int, sex : Boolean) { var sex by property(SimpleBooleanProperty(sex)) fun sexProperty() = getProperty(Person::sex) }

标签: javafx tableview kotlin tornadofx


【解决方案1】:

cellCache 为列表中的每个项目创建一个唯一的单元格。如果您的项目没有实现有意义的equalshashCode 函数,您将遇到cellCache 的问题,因为同一个单元格将用于多个基础项目。

添加 equalshashCode 实现以确保每个项目都是唯一的应该可以解决问题。似乎 Kotlin 数据类中的默认实现并没有削减它:)

如果您不能或不会提供equalshashCode 实现,我建议您改用cellFormat,它不依赖对象相等来生成唯一单元格。

很抱歉,指南中没有明确说明,我将更新 TableView 部分,提供更多信息和有关使用 cellCache 的警告。

【讨论】:

  • 非常感谢,我现在应该在我的代码中测试它。
  • 谢谢,cellFormat 为我工作! graphic = checkbox { isSelected = it setOnAction { println("Selection: $isSelected") } }
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多