所以,我有一个案例,我需要有以下形式的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()
之外没有任何效果的东西。打电话,但是我必须有一个逻辑,我应该在这个代表视图的类中显示哪个视图,我不想要那个。
答案 0 :(得分:1)
这不适合您的原因是您只需致电parameterContainer.getView()
,但不要将视图添加到该行。我认为让您感到困惑的是,对于构建者,您可以简单地说label()
,并将其添加到构建器树中的当前节点。在您的情况下,您只需说Label()
(只创建一个Label实例,而不是调用标签构建器),这将创建一个新的Label,但不会将其添加到当前节点的子列表中。要解决您的问题,请执行以下操作:
this += it.parameterContainer.getView()
这会将视图添加到行中。
除此之外,我还没有完全看到ValueContainer的观点。将View放入此容器对象中可以解决什么问题?我怀疑这可能是由于误解造成的,我想知道为什么你觉得你需要这种结构。