创建一个任意的视图

所以,我有一个情况,我需要有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块中使用它时,它不会显示在布局中。 rootGridPaneparameters是具有ValueContainer实现的名称和引用的对象列表( BooleanValueContainer或其他我没有显示的):

 init { with(root) { parameters.map { row(it.name) { it.parameterContainer.getView() } } } } 

我在这里呆了很长一段时间,我试过任何我能找到的,但除了把textviewcheckbox块,而不是getView()调用,但没有真正的工作,但是,然后我将不得不有什么观点,这个班代表了一个观点,我不想这个。

这不是为你工作的原因是,你只需调用parameterContainer.getView()但不要添加视图的行。 我觉得有些令人困惑的是,对于构建者来说,你可以只说label() ,并将其添加到构建器树中的当前节点上。 在你的情况下,你只是说Label() (只是创建一个Label的实例,而不是调用标签生成器),这将创建一个新的标签,但不会将其添加到当前节点的子列表。 要解决您的问题,请执行:

 this += it.parameterContainer.getView() 

这会将视图添加到行中。

除此之外,我还没有看到ValueContainer的重点。 这个容器对象里放一个View是什么解决的? 我怀疑这可能是由于一个误解,我想了解为什么你觉得你需要这个构造。