用于GUI元素的垃圾收集器

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

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对象的所有链接?

我很抱歉新手问题。

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

Swing代码执行的EventDispatchThread。

顶级容器从未离开JVM内存,也无法处理或GC,因为:

  • 缺少方法在API中完成,

  • 顶级容器来自Native OS,

  • 可以只垃圾其图形(2D)(删除其内容后),然后只有空容器,

  • 直到当前存在JVM实例,然后你可以在这里重新使用这个/这些容器

使用方法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); } 

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