1
私はjavafxコンポーネント用の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
はlabel
またはChild
クラスで宣言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