改变一些数据的属性的值,但是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 并重命名某些字段时,很明显您使用的是 String
和 Int
字段,而不是 StringProperty
和 IntegerProperty
,这显然不'不支持绑定。
如果 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!" }
}
}
似乎一切正常。正如您在仅更改 Int
和 String
字段之前看到的那样,这些字段不会导致任何更新。
对于可观察属性,您必须引用 属性,而不是 getter。如果您引用 getter 您将看到数据,但它永远不会更新。回到您首先定义用户对象的方式,然后为列引用 User::idProperty 和 User::nameProperty。
对于 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 并重命名某些字段时,很明显您使用的是 String
和 Int
字段,而不是 StringProperty
和 IntegerProperty
,这显然不'不支持绑定。
如果 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!" }
}
}
似乎一切正常。正如您在仅更改 Int
和 String
字段之前看到的那样,这些字段不会导致任何更新。
对于可观察属性,您必须引用 属性,而不是 getter。如果您引用 getter 您将看到数据,但它永远不会更新。回到您首先定义用户对象的方式,然后为列引用 User::idProperty 和 User::nameProperty。