Итак, у меня есть случай, когда мне нужно иметь N строк в виде: Label TextView/Checkbox
. Возможно, мне понадобится больше этих двух представлений, поэтому я хочу иметь возможность поддерживать все, что есть TornadoFx View
.
Я создал интерфейс с одним методом, который возвращает TornadoFx View
, и он выглядит так:
interface ValueContainer {
fun getView() : View
}
Одна из реализаций выглядит так:
class BooleanValueContainer(val checked: Boolean) : ValueContainer {
val valueProperty = SimpleBooleanProperty(checked)
override fun getView(): View {
return (object : View() {
override val root = checkbox {
bind(valueProperty)
}
})
}
}
Теперь, когда я пытаюсь использовать его внутри блока init
, он не отображается в макете. root
- это GridPane
, а parameters
- это список объектов, имеющих имя и ссылку на реализацию ValueContainer
(BooleanValueContainer
или другой, который я не показал):
init {
with(root) {
parameters.map {
row(it.name) {
it.parameterContainer.getView()
}
}
}
}
Я застрял здесь довольно долго и пробовал все, что мог найти, но ничего не работало, кроме помещения блока textview
или checkbox
вместо вызова getView()
, но тогда мне нужно было бы иметь логику в том, какое представление я должен отображать внутри этого класса который представляет собой представление, а я этого не хочу.