用于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); }
但它取决于你想要用你的框架做什么。