【问题标题】:JDialog setVisible(false) vs dispose()JDialog setVisible(false) vs dispose()
【发布时间】:2011-11-07 13:38:18
【问题描述】:

在对话框上使用 setVisible(false) 并在以后重用它是否有意义,或者每次调用 dispose() 并创建一个新的 JDialog 更安全。 使用 setVisible(false) 会导致内存泄漏怎么办?

编辑: 我的问题与退出应用程序无关。更多关于以主框架为父级并在应用程序生命周期内打开和关闭的对话框。例如。假设我的应用程序有大约 10 个对话框,每次打开它们时都会显示不同的数据。我应该重用实例并使用 setVisible() 还是应该每次都创建一个新 Dialog 并在关闭时 dispose() 它们。

【问题讨论】:

  • dispose() 将重用这些相同的实例,同时释放资源并释放内存。
  • 也很高兴知道:一旦 JDialog 被打包()或 setVisible()d,它不会被垃圾收集,直到你调用 dispose()!

标签: java swing jdialog


【解决方案1】:

当一个窗口被隐藏两次时,我遇到了不同的情况(例如由于软件设计不佳) 如果您处置已处置的窗口,VM 将挂起。 (爪哇 8) 如果你在一个已经不可见的窗口上设置可见 false 生命继续......

【讨论】:

    【解决方案2】:

    调用dispose() 会释放与对话框关联的资源。您可以在dispose() 之后保留对话框。如果您担心周围有太多对话框,请使用WeakReference 来保存参考。这将确保您不使用的对话框仅在不需要它们占用的空间时才能在垃圾收集中存活。

    【讨论】:

      【解决方案3】:

      我仍然看不出between JDialog#dispose();JDialog.setVisible(false) 更多here 有任何区别,它们中的每一个都可以被唤醒以供重用,并且无论是/被处置还是可见

      我的观点是这个问题必须分成三个不同的领域

      1) 一些JFrameJDialogJWindow (exist only is is there JFrame) 的父级,那么最后一个必须关灯

      2)without parent for JDialog

      3)还有一个JFrame, JDialog or JWindow,那么最后一个必须关灯

      • 可通过使用 --> Window[] wins = Window.getWindows(); 访问
      • 最后一个必须关灯 --> System.exit(0);
      • 我建议在所有可能的情况下都必须存在可见的JFrameJFrame.EXIT_ON_CLOSE,或者另一种方式可以实现WindowsListenerSystem.exit(0);

      【讨论】:

        【解决方案4】:

        我建议使用dispose() 来释放资源并释放内存。如果您想再次显示该对话框,只需调用setVisible(true)


        请务必注意,当 Java 虚拟机 (VM) 中的最后一个可显示窗口被处理掉时,VM 可能会终止。有关更多信息,请参阅AWT Threading Issues

        【讨论】:

        • JWindow 和 JDialog 错过了方法 finalize(),然后就不是那么容易了,也没有 GC ..... btw +1 stackoverflow.com/questions/6309407/…
        • 也许你需要提一下,如果你经常重复使用同一个对话框,最好使用 setVisible(false),这样 JVM 就不需要每次显示它时都分配资源。
        猜你喜欢
        • 2013-08-22
        • 2011-12-10
        • 1970-01-01
        • 1970-01-01
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 2015-07-23
        相关资源
        最近更新 更多