代码之家  ›  专栏  ›  技术社区  ›  Freewind thk

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

  •  1
  • Freewind thk  · 技术社区  · 7 年前

    对于Tornado FX的一个非常简单的表格演示,我只想展示一些 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 回复  |  直到 7 年前
        1
  •  2
  •   Selim    7 年前

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

    当重构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!" }
        }
    }
    

    一切看起来都很好正如你所看到的,在你改变之前 内景 字符串 不会导致任何更新的字段。

        2
  •  1
  •   Edvin Syse    7 年前

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