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

如何在TornadoFx表视图中显示POJO属性?

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

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

    主要代码是:

    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 回复  |  直到 7 年前
        1
  •  3
  •   Edvin Syse    7 年前

    你需要引用属性,而不是getter。 User::id . 要引用不可变属性,需要使用 readonlyColumn 建设者:

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

    也就是说,您确实应该在域对象中使用javafx属性。在基于JavaFX的应用程序中不这样做只会使所有事情变得更困难,并且您可以从很多好处中解脱出来,或者至少您必须跳出困境。

    下面是用可观察的JavaFX属性编写的完整应用程序。请注意,然后您将访问 idProperty nameProperty 而不是属性。使用此方法,对基础数据项的更改也将自动在TableView中可见:

    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)
            }
        }
    }