Как в TornadoFX разделить макеты на разные классы, а затем использовать их в конструкторе?

Например, я хочу иметь TabPane, но хочу, чтобы каждая вкладка находилась в отдельном классе. Есть ли способ заставить это работать с застройщиком? Я хочу сделать что-то вроде этого:

tabpane {
    MyFirstTab()
    MySecondTab()
    etc.
}

person Aleksandar Stefanović    schedule 22.01.2017    source источник


Ответы (1)


Обычно вы добавляете корневой узел из другого View с помощью команды add:

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 должен быть View или Fragment.

person Edvin Syse    schedule 22.01.2017