使用tornadofx

时间:2018-01-31 14:51:07

标签: kotlin tornadofx

我为我的模型使用kotlinx.serialization。 我希望他们不依赖于JavaFX,因此他们不会公开属性。

给定一个模型,我想要一个tableview来快速表示一个实例列表,另外还有一个更详细的Fragment作为一个编辑器。

考虑以下模型:

@Serializable
data class Person(
        var name: String,
        var firstname: String,
        var complex: Stuff)

包含tableview的视图包含

private val personlist = mutableListOf<Person>().observable()

使用tableview在按下Enter时打开所选行的PersonEditor实例:

tableview(personlist) {
    column("name", Person::name)
    column("first name", Person::firstname)

    setOnKeyPressed { ev ->
        selectedItem?.apply {
            when (ev.code) {
                KeyCode.ENTER -> PersonEditor(this).openModal()
            }
        }
    }
}

我跟着this gitbook section(但不希望模型视图在tableview中选择另一行时反弹) 编辑器看起来像这样:

class PersonEditor(person: Person) : ItemFragment<Person>() {
    val model: Model = Model()

    override val root = form {
        fieldset("Personal information") {
            field("Name") {
                textfield(model.name)
            }
            field("Vorname") {
                textfield(model.firstname)
            }
        }
        fieldset("complex stuff") {
            //... more complex stuff here
        }
        fieldset {
            button("Save") {
                enableWhen(model.dirty)
                action { model.commit() }
            }
            button("Reset") { action { model.rollback() } }
        }
    }

    class Model : ItemViewModel<Person>() {
        val name = bind(Person::name)
        val firstname = bind(Person::firstname)
        //... complex stuff
    }

    init {
        itemProperty.value = mieter
        model.bindTo(this)
    }
}

当我在详细视图中保存编辑的值时,不会更新tableview。 什么是解决这个问题的最佳实践?

另外,我不确定,如果我所做的事情可以被视为良好的实践,那么我也很乐意就此提出一些建议。

1 个答案:

答案 0 :(得分:1)

JavaFX应用程序中的最佳实践是使用可观察的属性。不这样做是一场艰苦的战斗。您可以保留精简域对象,但添加具有可观察属性的JavaFX / TornadoFX特定版本。此对象可以了解如何将数据复制到“精益”域对象中或从中复制数据。

使用这种方法,特别是与ItemViewModel组合使用时,将确保您的数据始终更新。

您发布的groupby代码可以更改为:

df.set_index('Col1').sum(level=0)
Out[294]: 
      Col2  Col3
Col1            
Foo      4     1
Bar      5     3

请注意,您不应该直接实例化视图和片段,因为这样做会跳过TornadoFX生命周期中的某些步骤。相反,你应该将person作为参数传递,或者在打开该范围内的编辑器之前创建一个新的范围并将PersonModel注入该范围:

setOnKeyPressed