创建任意视图

时间:2016-10-29 15:38:56

标签: kotlin tornadofx

所以,我有一个案例,我需要有以下形式的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()之外没有任何效果的东西。打电话,但是我必须有一个逻辑,我应该在这个代表视图的类中显示哪个视图,我不想要那个。

1 个答案:

答案 0 :(得分:1)

这不适合您的原因是您只需致电parameterContainer.getView(),但不要将视图添加到该行。我认为让您感到困惑的是,对于构建者,您可以简单地说label(),并将其添加到构建器树中的当前节点。在您的情况下,您只需说Label()(只创建一个Label实例,而不是调用标签构建器),这将创建一个新的Label,但不会将其添加到当前节点的子列表中。要解决您的问题,请执行以下操作:

this += it.parameterContainer.getView()

这会将视图添加到行中。

除此之外,我还没有完全看到ValueContainer的观点。将View放入此容器对象中可以解决什么问题?我怀疑这可能是由于误解造成的,我想知道为什么你觉得你需要这种结构。