为什么Swing JFrame始终可以访问?

时间:2011-03-25 08:42:17

标签: java swing jframe

为什么JFrame实例总是在Swing应用程序中可以访问?这不会阻止它被垃圾收集吗?

JFrame frame = new JFrame();
System.out.println(Window.getWindows().length); // says '1'

致电dispose()没有帮助。它甚至没有显示出来。

3 个答案:

答案 0 :(得分:5)

java.awt.Windows上没有getWindows方法,但是有一个Frame.getFrames()方法。

但我知道他们都使用WeakReference来管理这些事情。

基本上,我们的想法是Window和Frame类都有一个名为 weakThis 的字段,它是当前帧/窗口对象的弱引用。每当需要存储对象时(例如在appcontext中),使用weakThis字段代替它。 (如果你不知道的话,弱引用不会阻止对象的获取)

编辑:Window.getWindows在1.6中添加。

答案 1 :(得分:-2)

这是因为你仍然有一个对你的窗口的引用,你没有让JFrame为垃圾收集做好准备,这样就完成了删除对它的引用。例如,将其设置为null;

如果垃圾收集器进行了清理,则下一个示例将返回0。

JFrame frame = new JFrame();
frame = null;
System.gc();
System.out.println(Window.getWindows().length);

这是示例代码,它将在大多数情况下工作,如果调用GC。无法保证System.gc()将调用GC。不要在生产代码中使用它。

答案 2 :(得分:-2)

因为JFrame对象尚未被垃圾回收。试试这个:

import java.io.*;
import java.awt.*;
import javax.swing.*;
public class WTest
{
    public static void main(String[] args)
    {
        JFrame jfTmp = new JFrame();
        jfTmp.dispose();
        jfTmp = null;

        System.runFinalization();
        System.gc();

        Window[] arrW = Window.getWindows();
        for(int i = 0; i < arrW.length; i ++)
            System.out.println("[" + i + "]\t" + arrW[i].getClass());
    }
}