Mac では Swing で SingleFrameApplication#shutdown() が呼ばれない時がある
Swing のメモ。
Swing を使ったアプリでは SingleFrameApplication#shutdown() をオーバーライドして終了処理を記述する。この時、Windows ではクローズボタンで終わろうが、Alt+F4 で終わろうが、強制終了で終わろうが、ちゃんと shutdown() が最後に呼び出される。しかし、Mac だと正しく shutdown() が呼び出されない時がある。File -> Exit で終了した時など GUI 上で終了させた時は問題ないが、Cmd+Q や強制終了で JVM ごと終わらせた時には shutdown() が呼び出されず、終了処理が行えない。
そんな時の対処法が以下。
@Override
protected void startup()
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
public void run()
{
if (!shutdowned) {
shutdown();
}
}
// 通常の起動処理
...
});
}
@Override
protected void shutdown()
{
if (shutdowned) {
return;
}
super.shutdown();
shutdowned = true;
}
このやり方が正しいのかは分からないけど、Runtime#addShutdownHook() なら Mac でも shutdown() を呼び出せるので終了処理がきちんと行える。Swing はシステム関係無くアプリ開発出来ることを謳ってるので、結構この問題はクリティカルだと思う。Sun さんの修正を期待。
こんなエントリー、ActionScript と関係無さそうだけど、Flash 開発のために必要なことをやっているのです…。