在下面的示例中,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;
    }
}

最佳答案

在现实世界中,这些帧还包含许多其他引用,并且由于它们永远不会被垃圾回收,因此会导致内存泄漏。


这些窗口被存储为弱引用,因此可以通过垃圾回收器将其从内存中删除。

09-26 03:09