在 TornadoFX 中,如何将布局分离到不同的 类,然后在生成器中使用它们?

In TornadoFX, how can I separate layouts to different classes and then use them in builder?

例如,我想要一个 TabPane,但我希望每个选项卡都在其单独的 class 中。有没有办法让这个与构建器一起工作?我想做这样的事情:

tabpane {
    MyFirstTab()
    MySecondTab()
    etc.
}

一般情况下,您使用 add 命令从另一个 View 添加根节点:

add(SomeView::class)

你也可以注入一个View然后添加:

val someView: SomeView by inject()

override val root: borderpane {
    center {
        add(someView)
    }
}

add 等同于 this += someView。这里发生的是框架找到视图的 root 节点并将其附加到父节点的 children 属性。它也知道像 BorderPane 这样的特殊容器,所以当你在 center 构建器等中添加一些东西时它会做正确的事情

然而,TabPane 需要 Tab 个实例,这些实例不是节点。您需要使用 tab 构建器添加选项卡并为其分配一些内容。构建者足够聪明,可以理解如果您在选项卡内执行 add,它应该分配给选项卡的 content 属性。因此你可以这样写:

tab("My First Tab") {
    add(MyFirstTab::class)
}

或者,如果您已经有了要分配的内容实例:

tab("My First Tab") {
    add(myFirstTab)
}

MyFirstTab class 必须是 ViewFragment.