【问题标题】:Memory leaking on JDialog closingJDialog 关闭时内存泄漏
【发布时间】:2013-04-07 13:56:13
【问题描述】:

我正在开发一个 Java 应用程序,该应用程序由(迄今为止)一个常规窗口 (JFrame) 和一个由菜单项首先调用的 JDialog 组成:

public class MainWindow {
    private JFrame frame;
    public MyDialog dialog;
    /* ... */
    private void initialize() {
         mnNew = new JMenuItem("New...");
         mnNew.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent arg0) {
             dialog = new MyDialog();
             }
         });
     }
}

MyDialog定义如下:

public class MyDialog extends JDialog {

    public MyDialog() {
        /* ... */
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                MyDialog.this.dispatchEvent(new WindowEvent(MyDialog.this,
                                            WindowEvent.WINDOW_CLOSING));
                MainWindow.window.matchMaker = null;
            }
        });
        /* ... */
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setVisible(true);
    }
}

一切正常,但我的任务管理器报告每次我打开然后关闭 MyDialog 时,程序消耗的内存越来越多。为什么?

【问题讨论】:

    标签: java swing memory-leaks jdialog


    【解决方案1】:

    【讨论】:

    • 非常感谢。但是在处理并将dialog 变量设置为null 之后,不应该将MyDialog 从内存中删除吗?无论如何,它什么也没做。现在我在 MainWindow 构造函数中创建一次 MyDialog,将其可见性设置为 false。我使用 MainWindow 中的一个函数使其可见,而在 MyDialog 中使用另一个函数使其不可见,但每当我关闭并重新打开 Dialog 时,内存仍在泄漏。
    • 这只能通过使用静态变量来实现,
    【解决方案2】:

    实例化 MyDialog 一次:

    public class MainWindow {
       private JFrame frame;
       private final MyDialog dialog = new MyDialog();
    

    在 MyDialog 构造函数中删除 setVisible(true)

    要显示对话框,只需执行setVisible( true )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-28
      • 2013-03-29
      • 2010-11-28
      • 2018-08-26
      • 2013-07-12
      • 2012-09-10
      • 1970-01-01
      • 2011-03-21
      相关资源
      最近更新 更多