tornadoFXで出てくるメインウィンドウを閉じいたときの処理で詰まったのでメモ
方法
primaryStageのclose()[閉じるとき]やsetOnCloseRequest()またはshowingProperty().addListener()[閉じる処理を書くとき]を呼ぶ
Main.kt
import tornadofx.*
class Main:App(MyView::class)
class MyView :View() {
override val root = Form()
val textfield = textfield ("hello world")
init{
with(root){
fieldset{
textfield
//閉じるボタン
button { action { primaryStage.close() } }
}
}
//プログラム上から閉じたらこっちは呼ばれない
//primaryStage.setOnCloseRequest { e -> println("close")}
//こっちだとプログラム上で消しても呼ばれる
primaryStage.showingProperty().addListener {obs,oldValue,newValue->
if (oldValue == true && newValue == false) {
println("close")
}
}
}
}
説明
Appのコンストラクタで指定してるのはJavaFXでいうところのStageに乗せるSceneなので、指定してるViewでcloseしても意味がない。Viewが載っているStageにprimaryStageでアクセスできるので、それのclose()を呼べば閉じる。
消したときの処理も同様。ただし、onCloseRequestはプログラム上からcloseしたときは反応しない(ウインドウ上のXボタンを押したときのみ)ので、このページで言われているようにshowingProperty()を使ったほうがいい。
あとがき
javaFXとの対応関係が解れば当たり前の話だったけど、main周りがかなり違って対応関係が解らずかなり詰まった。