1
我想在javatx组件中为Kotlin提供构建器模式。该模式将类似于下面如何构建Kotlin中JavaFX组件的构建器模式
fun main(args: Array<String>) {
val vb = vbox {
child {
hbox {
child {
label {
prefWidth = 20.0
}
button {
text = "Click"
}
}
}
label {
prefHeight = 80.0
}
}
}
}
我迄今所做的是如下,但child
不暴露在Child
类中声明的label
或button
方法。任何指针?
fun Pane.child(init: (Pane.() -> Unit)? = null): Child {
val ch = Child()
init?.invoke(this)
ch.parent = this
return ch
}
class Child {
var parent: Pane? = null
fun <T : Node> initChildNode(styleClass: String? = null, tag: T, init: (T.() -> Unit)? = null): T {
init?.invoke(tag)
tag.styleClass.add(styleClass)
parent?.children?.add(tag)
return tag
}
fun region(styleClass: String? = null, init: (Region.() -> Unit)? = null) = initChildNode(styleClass, Region(), init)
fun vbox(styleClass: String? = null, init: (VBox.() -> Unit)? = null) = initChildNode(styleClass, VBox(), init)
fun hbox(styleClass: String? = null, init: (HBox.() -> Unit)? = null) = initChildNode(styleClass, HBox(), init)
fun label(styleClass: String? = null, init: (Label.() -> Unit)? = null) = initChildNode(styleClass, Label(), init)
fun button(styleClass: String? = null, init: (Button.() -> Unit)? = null) = initChildNode(styleClass, Button(), init)
}
fun vbox(styleClass: String? = null, init: (VBox.() -> Unit)? = null) = initNode(styleClass, VBox(), init)
fun hbox(styleClass: String? = null, init: (HBox.() -> Unit)? = null) = initNode(styleClass, HBox(), init)
fun <T : Node> initNode(styleClass: String? = null, tag: T, init: (T.() -> Unit)? = null): T {
init?.invoke(tag)
tag.styleClass.add(styleClass)
return tag
}
注:我已经调查了TornadoFX库,但我喜欢拿出自己的解决方案大多是由于学习的目的。
如果你想这些功能在范围上,你应该让你的'init'参数扩展'儿童'而不是'窗格'。 – zsmb13
你应该在这里有你需要的一切https://kotlinlang.org/docs/reference/type-safe-builders.html – Calin