Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 已处理的JFrame仍从Window.getWindows()返回_Java_Swing_Jframe - Fatal编程技术网

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

Java 已处理的JFrame仍从Window.getWindows()返回,java,swing,jframe,Java,Swing,Jframe,在下面的示例中,大型机创建其他JFrame。这些新创建的帧已将DISPOSE_ON_CLOSE设置为默认关闭操作。单击“关闭”按钮时,帧消失,但仍可从窗口中使用。getWindows()方法。当我打开4个窗口时,关闭它们,然后单击显示的“打印窗口计数” Windows: 4 如何使它们从所有不受我控制的Swing资源中永久消失 在现实世界中,这些帧包含许多其他引用,这会导致内存泄漏,因为它们永远不会被垃圾收集 import javax.swing.*; import java.awt.Bord

在下面的示例中,大型机创建其他JFrame。这些新创建的帧已将DISPOSE_ON_CLOSE设置为默认关闭操作。单击“关闭”按钮时,帧消失,但仍可从窗口中使用。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;
    }
}
虽然说“这些组件的资源将被销毁,它们消耗的任何内存都将返回到操作系统,并且它们将被标记为不可扩展。”,但我被告知,当JFrame及其子级的所有引用都消失时,就会发生这种情况

因此,如果您执行
JFrame,那么您的frame=null它应该可以工作。

虽然说“这些组件的资源将被销毁,它们消耗的任何内存都将返回到操作系统,并且它们将被标记为不可扩展。”,但我被告知,当JFrame及其子代的所有引用都消失时,就会发生这种情况

因此,如果您执行
JFrame,那么您的frame=null它应该可以工作

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

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;
    }
}
这些窗口存储为弱引用,因此垃圾收集器可以将它们从内存中删除

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

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;
    }
}

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

dispose
通常只处理帧使用的本机资源,而不处理帧对象本身。您可以<代码>处理<代码> jFrase>代码> >稍后重新打开它,也可以考虑在计算Windows >代码>处置< /COD>之前运行垃圾回收循环,通常只处理框架使用的本机资源,不处理框架对象本身。你可以<代码>处理<代码> jFrase>代码> >稍后重新打开它。你也可以考虑运行垃圾回收循环,然后在查看OP代码的Windows SIF之前,你可以看到它们不保存对他们想要关闭的JFrice的引用。Matt是对的,我不保留任何对JFrrar的引用。斯温是的。otherFrame是保存在堆栈框架上的本地引用(lamba代码)。仅使用保留字
new
创建引用(变量名和内存位置之间)。因此,是的,创建的每个对象都有一个引用。然后,要从JFrame对象释放内存,可以使用保留字
null
。关于。@tomyforever它只会将其标记为符合垃圾收集条件,假设系统没有维护对其任何部分(即本机资源或侦听器)的引用。即便如此,Swing也倾向于抓住一个单打window@MadProgrammer你是对的,但我的回答也没有错。为什么我投了反对票?许多答案都谈到asign
null
和垃圾收集器。如果你看op的代码,你会发现他们没有保留对想要关闭的jframe的引用。Matt是对的,我没有保留对jframe的任何引用。斯温是的。otherFrame是保存在堆栈框架上的本地引用(lamba代码)。仅使用保留字
new
创建引用(变量名和内存位置之间)。因此,是的,创建的每个对象都有一个引用。然后,要从JFrame对象释放内存,可以使用保留字
null
。关于。@tomyforever它只会将其标记为符合垃圾收集条件,假设系统没有维护对其任何部分(即本机资源或侦听器)的引用。即便如此,Swing也倾向于抓住一个单打window@MadProgrammer你是对的,但我的回答也没有错。为什么我投了反对票?许多答案都谈到asign
null
和垃圾收集器。这似乎是正确的答案。O打开JVisualVm并调用垃圾收集。在此之后,窗口计数为1(只剩下主帧)。谢谢。这似乎是正确的答案。O打开JVisualVm并调用垃圾收集。在此之后,窗口计数为1(只剩下主帧)。谢谢