web-dev-qa-db-ja.com

JDialog setVisible(false)とdispose()

ダイアログでsetVisible(false)を使用して後で再利用することは理にかなっていますか、毎回dispose()を呼び出して新しいJDialogを作成する方が安全ですか。 setVisible(false)によるメモリリークはどうですか?

編集:私の質問は、アプリケーションの終了についてはそれほどではありません。メインフレームを親として持ち、アプリケーションの存続期間中に開閉されるダイアログの詳細。例えば。私のアプリケーションに約10個のダイアログがあり、それらを開くたびに異なるデータを表示するとします。インスタンスを再利用してsetVisible()を使用するか、毎回新しいダイアログを作成して閉じるときにdispose()する必要があります。

22
keuleJ

dispose() を使用してリソースを解放し、メモリを解放することをお勧めします。ダイアログを再度表示する場合は、setVisible(true)を呼び出します。


Java仮想マシン(VM)内の最後の表示可能なウィンドウが破棄されると、VMが終了する場合があります。 詳細については、AWTスレッドの問題

25
mre

between JDialog#dispose();JDialog.setVisible(false) more here の違いはまだわかりません。それぞれが再利用のためにウェイクアップする可能性があり、次の場合は関係ありません/処分または可視化された

私の見解では、この質問は3つの別々の領域に分割する必要があります

1)一部のJFrameJDialogまたはJWindow(_exist only is is there JFrame_)の親であり、最後の1つはライトをオフにする必要があります

2) JDialogの親なし

3)まだ別の_JFrame, JDialog or JWindow_が存在し、最後にライトをオフにする必要があります

  • -> Window[] wins = Window.getWindows();を使用して到達可能
  • 最後にライトをオフにする必要があります-> System.exit(0);
  • 考えられるすべてのケースで、_JFrame.EXIT_ON_CLOSE_を使用して目に見えるJFrameが存在する必要があるか、または別の方法でWindowsListenerSystem.exit(0);に実装する
1
mKorbel

dispose()を呼び出すと、ダイアログに関連付けられているリソースが解放されます。 dispose()を実行した後も、ダイアログを保持できます。あまりにも多くのダイアログを配置することに不安がある場合は、 WeakReference を使用して参照を保持します。これにより、ダイアログが使用するスペースが不要である限り、使用しているダイアログがガベージコレクションのみを生き残ることができます。

0
Mad Physicist