如何在TornadoFX tableview中显示pojo属性?

时间:2018-07-23 17:39:38

标签: kotlin tornadofx

我正在编写一个非常简单的TornadoFX表演示,试图在表中显示某些pojos的属性,但是单元格都是空的。

主要代码是:

data class User(val id: Int, val name: String)

private val data = listOf(User(111, "AAA"), User(222, "BBB"), User(333, "CCC"), User(444, "DDD")).observable()

class HelloWorld : View() {

    override val root = vbox {
        tableview(data) {
            column("id", User::id.getter)
            column("name", User::name.getter)
        }
    }
}

我使用User::id.getter进行编译,但是单元格为空。

我做了很多搜索,但是找不到与最新的龙卷风(1.7.16)兼容的代码

这是一个完整的演示:https://github.com/javafx-demos/tornadofx-table-show-pojo-demo

1 个答案:

答案 0 :(得分:3)

您需要引用属性,而不是getter。 User::id。要引用不可变属性,您需要使用readonlyColumn构建器:

readonlyColumn("id", User::id)
readonlyColumn("name", User::name)

也就是说,您实际上应该在域对象中使用JavaFX属性。在基于JavaFX的应用程序中不这样做,只会使所有事情变得更加困难,并且您失去了很多好处,或者至少必须克服困难。

这是带有可观察的JavaFX属性编写的完整应用程序。请注意,您随后将访问idPropertynameProperty属性。通过这种方法,对基础数据项的更改也将自动在表视图中可见:

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

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


private val data = listOf(User(111, "AAA"), User(222, "BBB"), User(333, "CCC"), User(444, "DDD")).observable()

class HelloWorld : View() {
    override val root = vbox {
        tableview(data) {
            column("id", User::idProperty)
            column("name", User::nameProperty)
        }
    }
}