用于GUI元素的垃圾收集器

时间:2012-02-12 09:27:54

标签: java swing

我在理解以下代码时遇到问题:

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

public class A
{
      public A(){
        JFrame myframe = new JFrame ("hz window");
        myframe.setLayout(new GridLayout ());
        myframe.setSize(new Dimension (500, 200));
        myframe.setVisible(true);
    }

    public static void main (String arg[]){
        new A();
        //  System.gc();                          //1
          //Runtime.getRuntime().gc();            //2
    }
}

myframe对象的范围是A类的构造函数,对吧?

然后,为什么窗口没有消失(即在第1行和第2行被垃圾收集器删除)

我们在java程序中创建的所有gui元素的范围是什么?

JVM在哪里保留了应用程序的gui对象的所有链接?

对不起新手问题我很抱歉。

4 个答案:

答案 0 :(得分:7)

Swing保留对每个窗口对象的引用,直到用户关闭或使用dispose()函数强行处理它们为止。否则,你会看到神秘的GUI元素消失。

答案 1 :(得分:2)

Swing代码执行的EventDispatchThread。

答案 2 :(得分:2)

Top-Level Containers永远不会从JVM内存中消失,也不会被处置或GC,因为:

  • API中缺少方法终结,

  • 顶级容器来自Native OS,

  • 只能对其图形(2D)进行垃圾处理(删除其内容后),然后只有空容器,

  • 直到当前存在JVM实例,然后您可以重新使用此/这些容器,更多here

答案 3 :(得分:1)

使用方法dispose关闭Jframe 所以,如果你想关闭你,你就是jframe juste那样做

public static void main (String arg[]){
    Jframe a = new A();
    //do what ever you want and when it's done

    a.dispose();
}

垃圾收集器不在java中来关闭所有内容,并且jframe在它自己的线程中,因此确定它是否需要擦除是很复杂的。

此外,JFrame是一个独立的线程,通常通过单击框架右上角的X来关闭它,因此更好的解决方案可能是设置此操作的默认行为以进行处置

public A(){
    JFrame myframe = new JFrame ("hz window");
    myframe.setLayout(new GridLayout ());
    myframe.setSize(new Dimension (500, 200));
    myframe.setVisible(true);
    myframe.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
}

但它取决于你想要用你的框架做什么。