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