创建任意视图
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
块中使用它时,它不会显示在布局中。 root
是 GridPane
并且 parameters
是具有名称和引用 ValueContainer
实现的对象列表(BooleanValueContainer
或我未显示的其他对象) :
init {
with(root) {
parameters.map {
row(it.name) {
it.parameterContainer.getView()
}
}
}
}
我被困在这里很长一段时间,我尝试了所有我能找到的方法,但除了用 textview
或 checkbox
块而不是 getView()
调用外,没有任何效果,但是我必须对我应该在这个 class 中显示什么视图有逻辑,它代表一个视图,我不想要那个。
这对您不起作用的原因是您只是调用 parameterContainer.getView()
但没有将视图添加到行中。我认为让您感到困惑的是,对于构建器,您只需说 label()
,它就会添加到构建器树中的当前节点。在你的例子中,你只是说 Label()
(只是创建一个标签的实例,而不是调用标签构建器),这将创建一个新的标签,但不会将它添加到当前节点的子列表中。要解决您的问题,请执行以下操作:
this += it.parameterContainer.getView()
这会将视图添加到行中。
除此之外,我不太明白 ValueContainer 的意义。在这个容器对象里面放一个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
块中使用它时,它不会显示在布局中。 root
是 GridPane
并且 parameters
是具有名称和引用 ValueContainer
实现的对象列表(BooleanValueContainer
或我未显示的其他对象) :
init {
with(root) {
parameters.map {
row(it.name) {
it.parameterContainer.getView()
}
}
}
}
我被困在这里很长一段时间,我尝试了所有我能找到的方法,但除了用 textview
或 checkbox
块而不是 getView()
调用外,没有任何效果,但是我必须对我应该在这个 class 中显示什么视图有逻辑,它代表一个视图,我不想要那个。
这对您不起作用的原因是您只是调用 parameterContainer.getView()
但没有将视图添加到行中。我认为让您感到困惑的是,对于构建器,您只需说 label()
,它就会添加到构建器树中的当前节点。在你的例子中,你只是说 Label()
(只是创建一个标签的实例,而不是调用标签构建器),这将创建一个新的标签,但不会将它添加到当前节点的子列表中。要解决您的问题,请执行以下操作:
this += it.parameterContainer.getView()
这会将视图添加到行中。
除此之外,我不太明白 ValueContainer 的意义。在这个容器对象里面放一个View解决了什么问题?我怀疑这也可能是由于误解造成的,我想了解您为什么觉得需要这种结构。