これらの2つの方法の違いは何ですか-System.exit()
とJFrame.dispose()
?
ボタンがクリックされたときにJavaSwingアプリケーションを閉じたい場合、どの方法を使用する必要がありますか?
System.exit();
JavaVMを完全に終了させます。
JFrame.dispose();
ウィンドウがJFrame
破壊され、オペレーティングシステムによってクリーンアップされます。ドキュメントによると、これにより、他に使用可能なWindowsがない場合にJava VMが終了する可能性がありますが、これは実際には標準ではなく副作用と見なされるべきです。
どちらを選択するかは、実際には状況によって異なります。現在のJavaVMのすべてを終了する場合は、を使用する必要があります。そうすればSystem.exit()
、すべてがクリーンアップされます。現在のウィンドウのみを破棄し、これが唯一のウィンドウである場合にJava VMを閉じるという副作用がある場合は、を使用しますJFrame.dispose()
。
JFrame.dispose()
public void dispose()
このウィンドウ、そのサブコンポーネント、およびその所有するすべての子によって使用されるすべてのネイティブ画面リソースを解放します。つまり、これらのコンポーネントのリソースは破棄され、それらが消費するメモリはすべてOSに戻され、表示不可としてマークされます。ウィンドウとそのサブコンポーネントは、後でpackまたはshowを呼び出してネイティブリソースを再構築することにより、再び表示可能にすることができます。再作成されたウィンドウとそのサブコンポーネントの状態は、ウィンドウが破棄された時点でのこれらのオブジェクトの状態と同じになります(これらのアクション間の追加の変更は考慮されません)。
注: Java仮想マシン(VM)内の最後の表示可能なウィンドウが破棄されると、VMが終了する場合があります。詳細については、AWTスレッドの問題を参照してください。
System.exit()
public static void exit(int status)
現在実行中のJava仮想マシンを終了します。引数はステータスコードとして機能します。慣例により、ゼロ以外のステータスコードは異常終了を示します。このメソッドは、Runtimeクラスのexitメソッドを呼び出します。このメソッドは正常に戻ることはありません。
この呼び出しSystem.exit(n)
は、実質的に次の呼び出しと同等です。
Runtime.getRuntime().exit(n)
上記に加えて、を使用しSystem.exit()
て終了コードを返すことができSystem.exit(code);
ます。これを使用してプロセスを自動的に呼び出すと、実行中にエラーが発生したかどうかを判断するのに役立ちます。
複数のウィンドウを開いていて、閉じたウィンドウのみを閉じたい場合は、JFrame.dispose().
すべてのウィンドウを閉じてアプリケーションを終了する場合は、System.exit()
JFrame.dispose()は、このフレームにのみ影響します(このコンポーネント、そのサブコンポーネント、およびすべての子によって使用されるすべてのネイティブ画面リソースを解放します)。System.exit()はJVM全体に影響します。
すべてのJFrameまたはすべてのウィンドウを閉じて(フレームはWindowsを拡張するため)、アプリケーションを順序付きモードで終了する場合は、次のように実行できます。
Arrays.asList(Window.getWindows()).forEach(e -> e.dispose()); // or JFrame.getFrames()
プログラムを終了する場合は、System.exit(0);を使用します。
一方、複数のウィンドウがありますが、1つのウィンドウのみを終了して閉じることができ、dispose();を使用します。