0

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

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

我被困在这里很长一段时间了,我尝试了我能找到的任何东西,但除了放置textviewcheckbox阻塞而不是getView()调用之外,没有任何效果,但是我必须对我应该在这个类中显示什么视图有逻辑,它代表一个视图,我不希望那样。

4

1 回答 1

1

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

this += it.parameterContainer.getView()

这会将视图添加到行中。

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

于 2016-10-29T18:25:43.010 回答