gpt4 book ai didi

java - 已处理的 JFrame 仍从 Window.getWindows() 返回

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:38 25 4
gpt4 key购买 nike

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

最佳答案

In the real world these frames hold many other references and it causes memory leaks as they are never subject to be garbage collected.

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

关于java - 已处理的 JFrame 仍从 Window.getWindows() 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47132870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com