仍然从Window.getWindows()返回处理的JFrame

时间:2017-11-06 08:45:59

标签: java swing jframe

在下面的示例中,MainFrame会创建其他JFrame。这些新创建的帧将 DISPOSE_ON_CLOSE 设置为默认关闭操作。当我点击关闭按钮时,框架会消失但仍然可以从 Window.getWindows()方法获得。当我打开时,让我们说4个窗口,关闭它们并单击"打印窗口计数"它显示

Windows: 4

如何使它们永久地从我不受控制的所有Swing资源中消失?

在现实世界中,这些框架包含许多其他引用,它会导致内存泄漏,因为它们永远不会被垃圾收集。

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Window;

public class MainFrame extends JFrame {

    public static void main(String[] args) {
        MainFrame t = new MainFrame();
        SwingUtilities.invokeLater(() -> t.setVisible(true));
    }

    public MainFrame() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JButton newWindowButton = new JButton("Open window");
        newWindowButton.addActionListener((action) -> {
            JFrame otherFrame = createChildFrame();
            otherFrame.setVisible(true);
        });

        JButton printWidnowsButton = new JButton("Print windows count");
        printWidnowsButton.addActionListener((action) -> {
            System.out.println("Windows: " + Window.getWindows().length);
        });

        Container cp = getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(newWindowButton);
        cp.add(printWidnowsButton, BorderLayout.SOUTH);

        pack();
    }

    private JFrame createChildFrame() {
        JFrame otherFrame = new JFrame();
        otherFrame.setBounds(0, 0, 100, 100);
        otherFrame.setDefaultCloseOperation(
            WindowConstants.DISPOSE_ON_CLOSE);
        return otherFrame;
    }
}

2 个答案:

答案 0 :(得分:1)

  

在现实世界中,这些框架包含许多其他引用,它会导致内存泄漏,因为它们永远不会被垃圾收集。

这些窗口存储为弱引用,因此它们可以通过垃圾收集器从内存中删除。

答案 1 :(得分:-1)

认为java doc"这些组件的资源将被销毁,他们消耗的任何内存都将被返回给操作系统,并且它们将被标记为不可显示。" ,我被告知当JFrame及其子项的所有引用都消失时会发生。

所以,如果你做JFrame yourFrame = null;它应该有用。