创建一个任意的视图
所以,我有一个情况,我需要有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()
调用,但没有真正的工作,但是,然后我将不得不有什么观点,这个班代表了一个观点,我不想这个。
这不是为你工作的原因是,你只需调用parameterContainer.getView()
但不要添加视图的行。 我觉得有些令人困惑的是,对于构建者来说,你可以只说label()
,并将其添加到构建器树中的当前节点上。 在你的情况下,你只是说Label()
(只是创建一个Label的实例,而不是调用标签生成器),这将创建一个新的标签,但不会将其添加到当前节点的子列表。 要解决您的问题,请执行:
this += it.parameterContainer.getView()
这会将视图添加到行中。
除此之外,我还没有看到ValueContainer的重点。 这个容器对象里放一个View是什么解决的? 我怀疑这可能是由于一个误解,我想了解为什么你觉得你需要这个构造。