ホーム > Java, Swing > Mac では Swing で SingleFrameApplication#shutdown() が呼ばれない時がある

Mac では Swing で SingleFrameApplication#shutdown() が呼ばれない時がある

Swing のメモ。

Swing を使ったアプリでは SingleFrameApplication#shutdown() をオーバーライドして終了処理を記述する。この時、Windows ではクローズボタンで終わろうが、Alt+F4 で終わろうが、強制終了で終わろうが、ちゃんと shutdown() が最後に呼び出される。しかし、Mac だと正しく shutdown() が呼び出されない時がある。File -> Exit で終了した時など GUI 上で終了させた時は問題ないが、Cmd+Q や強制終了で JVM ごと終わらせた時には shutdown() が呼び出されず、終了処理が行えない。

そんな時の対処法が以下。

Java
@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 開発のために必要なことをやっているのです…。

カテゴリー: Java, Swing タグ: ,
  1. コメントはまだありません。
  1. トラックバックはまだありません。