在下面的示例中,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;
}
}
答案 0 :(得分:1)
在现实世界中,这些框架包含许多其他引用,它会导致内存泄漏,因为它们永远不会被垃圾收集。
这些窗口存储为弱引用,因此它们可以通过垃圾收集器从内存中删除。
答案 1 :(得分:-1)
认为java doc说"这些组件的资源将被销毁,他们消耗的任何内存都将被返回给操作系统,并且它们将被标记为不可显示。" ,我被告知当JFrame及其子项的所有引用都消失时会发生。
所以,如果你做JFrame yourFrame = null;
它应该有用。