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

Ale*_*vić 2 kotlin tornadofx

例如,我想拥有一个TabPane,但我想在各自的类中分别拥有一个标签。有没有办法使建造者能做到这一点?我想做这样的事情:

tabpane {
    MyFirstTab()
    MySecondTab()
    etc.
}
Run Code Online (Sandbox Code Playgroud)

Edv*_*yse 5

通常,您可以View使用以下add命令从另一个节点添加根节点:

add(SomeView::class)
Run Code Online (Sandbox Code Playgroud)

您还可以注入View并添加:

val someView: SomeView by inject()

override val root: borderpane {
    center {
        add(someView)
    }
}
Run Code Online (Sandbox Code Playgroud)

add和做一样this += someView。这里发生的是框架找到root视图的节点并将其附加到children父节点的属性。它还了解诸如的特殊容器BorderPane,因此当您在容器中添加内容时,它做对了center构建器中。

TabPane然而,需要Tab的情况下,这是不是节点。您需要使用tab构建器添加选项卡并为其分配一些内容。建设者足够聪明,足以理解,如果您add在选项卡中进行操作,则应将其分配给content选项卡的属性。因此,您可以编写:

tab("My First Tab") {
    add(MyFirstTab::class)
}
Run Code Online (Sandbox Code Playgroud)

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

tab("My First Tab") {
    add(myFirstTab)
}
Run Code Online (Sandbox Code Playgroud)

MyFirstTab类必须是一个ViewFragment