非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

JavaのGUIアプリは終了しても裏で動いたまま・・・完全終了させる方法は?

   

Javaの不思議なところなのですが、GUIアプリを閉じても実は完全に終了できておらず、裏で動いたままになっているんです。

ちょっと模擬してみる

フレームだけのこんなプログラムを作りました。

import java.awt.*;
import javax.swing.*;

public class AppEnd extends JFrame{
  protected Container pane;

  public static void main(String[] args){
    AppEnd f = new AppEnd("終了テスト");
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  AppEnd(String t){
    super(t);
    this.setSize(400, 300);
    pane = getContentPane();
  }
}
 

 

 

これをコンパイルして実行可能なjarファイルまで作ります。フォルダの中身はこんな感じ。

 

作ったjarファイルを起動させると、以下のようなフレームだけのアプリが立ち上がります。アプリの内容は今回はどうでもよくて、まずは1回起動させます。

 

まずは準備はここまで。

[ad#top-1]

アプリを消してみよう

アプリを右上のバッテンボタンを押して閉じます。

で、jarファイルを削除してみましょう。

 

すると、あれ?「使用中のファイル」としてエラーが出てしまいます。さっきちゃんと閉じたはずなのに。

 

それもそのはずで、タスクマネージャーを見てみると、Java(TM) Platform SE binary というものが動いていて、こいつがアプリを使用していることになっています。

 

これはアプリを起動させると現れるのですが、アプリの実態と思ってもらって良いです。要するに画面上では閉じたように見えても、バックグラウンド上では閉じられていないのです。

昔、Javaの覚えたてのころ、この現象に戸惑いました。だって(当時の)教科書には何も書かれていないんですもん。(今の教科書はどうなっているか知りませんが)

ちなみに、タスクマネージャー上でJava(TM) Platform SE binaryを終了させると、アプリが完全に終了されたことになり、さっきのjarファイルも削除(移動も)可能になります。

 

解決方法

アプリを閉じたときに完全終了させるためには、プログラムを以下のように終了命令を追加させなければなりません。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*; /* まずコイツを追加 */

public class AppEnd extends JFrame{
  protected Container pane;

  public static void main(String[] args){
    AppEnd f = new AppEnd("終了テスト");
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }

  AppEnd(String t){
    super(t);
    this.setSize(400, 300);
    pane = getContentPane();

    /* 以下の6行を追加 */
    this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    this.addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
    });
  }
}

 

JavaのGUIアプリは明示的に終了命令を書かなければならないんですね。

たぶん、終了時のイベントを発生させるためのものなんだろうけど、ウィンドウのバッテンボタンを押して閉じても裏で動いてしまうのは、機能的にちょっと変ですね。

ちなみに、終了時に「終了していいですか?」みたいな確認をしたい場合は、上記のSystem.exit(0); のところに記述すればOKです。

.

[ad#ad-1]

スポンサーリンク

 - Java