2011-01-28 20 views
11

一般的なSwingアプリケーションは最初からEDTを起動し、最後のウィンドウが閉じられると、アプリケーションは基本的にSystem.exitを暗黙または明示的に停止します。Swing EDTを停止する方法

しかし私の小さなアプリケーションは、実際にはSwingについて何も知らないフレームワークのためのプラグインです。私のプラグインは、ユーザから何らかの入力を受け取り、後で終了するために、ダイアログを表示するときに呼び出されますが、フレームワークは実行し続ける必要があります。だから私はSystem.exitと呼ぶことはできません。

しかし、私は... EDTを実行していきますとフレームワークが終了するとEDTはまだ実行し、実行し、実行すること

をしないのであれば、私はなしでEDTを殺すしたいと思いますアプリケーションを強制終了します。それ、どうやったら出来るの?オラクル/ Sunが問題にいくつかの光を当てるから

答えて

11

次のドキュメント:AWT Threading Issues

を[...]

を前1.4に、ヘルパースレッドは終了されませんでした。

    :1.4以降では、動作はAWTは、以下の3つの条件に該当する場合、アプリケーションが正常に終了することができ、そのすべてのヘルパースレッドを終了し、現在の実装では4030718.の修正の結果として変更された

  • 表示可能なAWTまたはSwingコンポーネントはありません。
  • ネイティブイベントキューにネイティブイベントがありません。
  • java EventQueuesにAWTイベントはありません。したがって

、System.exitとはしなければならない呼び出すことなく正常に終了することを希望するスタンドアロンAWTアプリケーション:

  • すると、すべてのAWTやSwingのコンポーネントは、ときにアプリケーションが終了表示不可作られていることを確認します。これは、すべてのトップレベルWindowsでWindow.disposeを呼び出すことによって実行できます。 Frame.getFramesを参照してください。 ...
  • AWTまたはSwingコンポーネントでアプリケーションによって登録されたAWTイベントリスナーのメソッドが無限ループに実行されたり、無期限にハングアップしないことを確認してください。たとえば、一部のAWTイベントによってトリガされたAWTリスナーメソッドは、同じタイプの新しいAWTイベントをEventQueueに送信できます。引数は、AWTイベントリスナーのメソッドは通常、ヘルパースレッドで実行されるということです。

[...]

+2

IIRCに問題があります。あなたはあなたのリソースのすべてを**処分することを確実にする必要があります。 –

0

から出るスイングを防止する(例えば、ダイアログが既に閉じているJOptionPane.showMessageDialog(…)を使用して表示)は、いくつかの非表示のウィンドウが存在してもよいです。あなたは、もはやそれを必要としない場合、あなたは簡単にそれらを取り除くことができ、

Stream.of(Window.getWindows()).forEach(System.out::println); 

を使用して、これをチェックすることができます。

Stream.of(Window.getWindows()).forEach(Window::dispose); 

イベントディスパッチスレッドは、停止する必要があります。

関連する問題