创建任意视图

Create an arbitrary view

所以,我有一个案例,我需要 N 行,形式如下:Label TextView/Checkbox。也许我需要的不仅仅是这两个视图,所以我希望能够支持任何 TornadoFx View.

我创建了一个接口,它有一个方法 returns 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 块中使用它时,它不会显示在布局中。 rootGridPane 并且 parameters 是具有名称和引用 ValueContainer 实现的对象列表(BooleanValueContainer 或我未显示的其他对象) :

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

我被困在这里很长一段时间,我尝试了所有我能找到的方法,但除了用 textviewcheckbox 块而不是 getView() 调用外,没有任何效果,但是我必须对我应该在这个 class 中显示什么视图有逻辑,它代表一个视图,我不想要那个。

这对您不起作用的原因是您只是调用 parameterContainer.getView() 但没有将视图添加到行中。我认为让您感到困惑的是,对于构建器,您只需说 label() ,它就会添加到构建器树中的当前节点。在你的例子中,你只是说 Label() (只是创建一个标签的实例,而不是调用标签构建器),这将创建一个新的标签,但不会将它添加到当前节点的子列表中。要解决您的问题,请执行以下操作:

this += it.parameterContainer.getView()

这会将视图添加到行中。

除此之外,我不太明白 ValueContainer 的意义。在这个容器对象里面放一个View解决了什么问题?我怀疑这也可能是由于误解造成的,我想了解您为什么觉得需要这种结构。