はじめに
Kotlin + JavaFXでGUIアプリ開発に挑戦したので、コントローラーとFXMLを紐づける方法をメモ代わりに残します。
実装方法
コントローラーのクラスを作成してfxml側で指定すると紐付けできます。
MainController.kt
class MainController : Application() {
override fun start(primaryStage: Stage?) {
....
}
}
main.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
prefHeight="400.0"
prefWidth="600.0"
fx:Controller="MainController">
</AnchorPane>
紐づけたコントローラーを初期化する
コントローラーの初期化方法はこちらを参考にしました。
最近のバージョンではinitialize()メソッドをコントローラー内に記述することで初期化できるみたいです。
fun initialize() { .... }
// または
@FXML private fun initialize() { .... }
ちなみにコントローラーが初期化されると、fxml内でfx:id
で指定したノードと同じ変数名を持つフィールド変数が初期化されます。
ただし、start()
より後に呼ばれるため、lateinit var
で宣言している状態でstart()
の中で変数を使用すると初期化されていないので失敗します。
また、initialize()
は継承する親クラスで宣言していても紐づけたコントローラーが初期化されるので、
BaseControllerクラスを用意して継承させるとかでもいいのかなと思いました。