更改某些数据的属性值,但tableview不会更新

时间:2018-07-24 06:13:32

标签: kotlin tornadofx

对于TornadoFX的非常简单的表演示,我只想在视图中显示一些users,并在单击change按钮时更改它们的名称。但是问题在于修改后的数据未显示在表中。

主要代码如下:

class User2(id: Int, name: String) {
    val idProperty = SimpleIntegerProperty(id)
    var id by idProperty

    val nameProperty = SimpleStringProperty(name)
    var name by nameProperty
}

val data2 = listOf(User2(111, "AAA"), User2(222, "BBB"), User2(333, "CCC")).observable()

vbox {
    tableview(data2) {
        column("id", User2::id)
        column("name", User2::name).minWidth(200)
    }
    button("Modify data with type of User2").setOnAction {
        data2.forEach { it.name += " changed!" }
    }
}

相反,如果我将User2定义如下(还将类名也更改为User1):

class User1(id: Int, name: String) {
    val id = SimpleIntegerProperty(id)
    val name = SimpleStringProperty(name)
}

一切正常。

我找不到第一个为什么不起作用的原因(因为代码大多是从the official guide复制而来的)

更新:

代表此问题的完整小样:https://github.com/javafx-demos/tornadofx-table-property-change-issue-demo

2 个答案:

答案 0 :(得分:2)

该问题似乎是由于命名混乱造成的:-)

在重构User2并重命名某些字段时,很明显,您使用的是StringInt字段,而不是StringPropertyIntegerProperty,这显然不是支持绑定。

如果User2如下所示:

class User2(id: Int, name: String) {
    val idProperty = SimpleIntegerProperty(id)
    var myId by idProperty

    val nameProperty = SimpleStringProperty(name)
    var myName by nameProperty
}

和更改它的代码如下:

vbox {
    tableview(data2) {
        column("myId", User2::myId)
        column("myName", User2::nameProperty).minWidth(200)
    }
    button("Modify data with type of User2").setOnAction {
        data2.forEach { it.myName += " changed!" }
    }
}

一切似乎都正常。如您所见,仅更改IntString字段不会导致任何更新。

答案 1 :(得分:1)

对于可观察的属性,您必须引用属性,而不是getter。如果引用吸气剂,您将看到数据,但它永远不会更新。返回到您首先定义User对象的方式,然后为这些列引用User :: idProperty和User :: nameProperty。