SwingApplication終了時の処理

f:id:kxbmap:20101203002929p:image
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処理が走るようになります。
(しかし何か不恰好な気がする。いい感じのやり方ないかな……)