对于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
答案 0 :(得分:2)
该问题似乎是由于命名混乱造成的:-)
在重构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
字段不会导致任何更新。
答案 1 :(得分:1)
对于可观察的属性,您必须引用属性,而不是getter。如果引用吸气剂,您将看到数据,但它永远不会更新。返回到您首先定义User对象的方式,然后为这些列引用User :: idProperty和User :: nameProperty。