SwingApplication終了時の処理
scala.swingのSwingApplicationにはquit()とshutdown()というメソッドがあります。
quit()はshutdown()とSystem.exit(0)を呼んでくれるので、shutdown()をオーバーライドして終了時の処理を書けばいいんだよねー。
object QuitNotCalledApplication extends SimpleSwingApplication { def top = new MainFrame override def shutdown() { println("shutdown...") } }
と思いきやこれではquit()は呼ばれてくれません。何故でしょう。
MainFrameの定義を見ると↓のようになってます。
class MainFrame extends Frame { override def closeOperation { System.exit(0) } }
閉じるボタンが押されたらSystem.exit(0)しちゃう訳です。
MainFrameはSwingApplicationのことなんて知らないのでそりゃそうですよね。
という訳でquit()を呼んでくれるFrameを自前で作ります。
class MyFrame(app: SwingApplication) extends Frame { require(app != null) override def closeOperation() { app.quit() } }
requireでappがnullでないことを保証しています。
閉じるボタンが押されたらquit()を呼びます。
これを使って先ほどのコードを修正。
object QuitCalledApplication extends SimpleSwingApplication { def top = new MyFrame(this) override def shutdown() { println("shutdown...") } }
これで閉じるボタンを押したときにshutdown処理が走るようになります。
(しかし何か不恰好な気がする。いい感じのやり方ないかな……)