- PR -

SwingによるGUIライブラリを呼び出し後のSystem.exit()

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2005-08-25 18:48
unibon です。こんにちわ。

引用:

未記入さんの書き込み (2005-08-24 13:07) より:
JOptionPaneは次のように使用しています。
第1引数の親ハンドルはCUIから呼ばれることもあり、nullを指定しています。

String val = JOptionPane.showInputDialog(
null , "値を入力してください");



原理はご推察のとおりだと思います。私も試してみましたが、
コード:
import javax.swing.*;

public class Hoge {
    public static void main(String[] args) {
        String val = JOptionPane.showInputDialog(null , "値を入力してください"); 
    }
}


だと終りませんね。ダミーの JFrame を作って、
コード:
import javax.swing.*;

public class Hoge {
    public static void main(String[] args) {
        JFrame f = new JFrame();
        String val = JOptionPane.showInputDialog(f, "値を入力してください");
        f.dispose(); 
    }
}


とすれば終れました。アプリケーション側に近い単純なラッパーとしてのライブラリーである JOptionPane のバグとも言えるように感じます。
今回の要件でしたら、JFrame のインスタンスは作るけど、表示しなければそれで良いようにも思いますがいかがでしょうか。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-08-26 11:56
全てのトップレベルウィンドウにたいしてdispose()すれば、イベントディスパッチスレッド
が自動的に停止するということですね。知りませんでした。
間違ったことをかいて済みません。

ということは、未記入さんの用途ではJOptionPaneのstaticメソッドは呼ばないほうがよ
さそうです。

JOptionPaneの各staticメソッドは内部で

1.JOptionPaneのインスタンス生成
2.JOptionPane#createDialog()をコールして、上記インスタンスの貼り付け先となる
 ダイアログインスタンスを作成
3.2で生成したダイアログに1を貼り付けて表示

といったことをやっているようです。
問題となっているのは、2で生成したダイアログに対してdispose()がされていないこと、
ということになるのではないでしょうか。

だとすれば、上記の処理に自分でdispose()を呼び出す処理を加えたメソッドを自作
して呼び出す、という手もありそうですよ。
未記入
会議室デビュー日: 2005/02/08
投稿数: 9
投稿日時: 2005-08-26 12:37
シュンさん、unibonさんご返答ありがとうございます。
自分はまだJavaのGUIのノウハウに乏しく、試行錯誤している状態です。

今回の件では、unibonさんが提示してくださったダミーのJFrameを
用いて実装することにしました。

今回の件では大変お世話になりました。
解決とさせていただきます。
今後ともよろしくお願いいたします。

スキルアップ/キャリアアップ(JOB@IT)