改变一些数据的属性的值,但是tableview没有更新

Change the value of a property of some data, but tableview doesn't update

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

中没有显示修改后的数据

主要代码如下:

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 定义如下(还将 class 名称更改为 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

看来这个问题是由混淆的命名引起的:-)

重构 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 字段之前看到的那样,这些字段不会导致任何更新。

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