2012-02-12 58 views
1

我有理解以下代碼中的問題垃圾收集器:用於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的構造,是嗎?

那麼,爲什麼不dissapeared窗口(即,由垃圾收集器在線路1和除去2)

這是我們在java程序創建所有的GUI元素的範圍?

JVM在哪裏保存到應用程序gui對象的所有鏈接?

對於新手問題,我很抱歉。

回答

7

Swing保持對每個窗口對象的引用,直到它們被用戶關閉或使用dispose()函數強制處置。否則,你會看到神祕消失的GUI元素。

2

執行Swing代碼的EventDispatchThread。

1

一個JFrame使用方法處置 所以如果你想關閉你的JFrame中庸之道做

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

但它取決於你想要在你的框架後做什麼。

2

Top-Level Containers從來沒有從JVM的內存了,也可設置或GC'ed,因爲:

  • 缺少方法在API中完成,

  • 頂層容器從本地OS來了,

  • 罐垃圾僅其圖形(2D)(除去其內容之後),則存在/只有空的容器(一個或多個),

  • 直到當前JVM實例存在,那麼你可以re_use這個/這些容器,更多here