在下面的示例中,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;
}
}
最佳答案
在现实世界中,这些帧还包含许多其他引用,并且由于它们永远不会被垃圾回收,因此会导致内存泄漏。
这些窗口被存储为弱引用,因此可以通过垃圾回收器将其从内存中删除。