2010-03-15 25 views
10

我創建了一個對話框,裏面有一個jpanel,如果我擺脫了對話框,jpanel仍然會被引用。當我點擊一個取消按鈕時,我想銷燬該對話框及其中的所有內容。如何刪除對話框和jpanel?如何刪除對話框引用的對象?

+5

MyClass o = new Myclass(); o = null; – gpampara 2010-03-15 08:10:29

回答

10

回答這個問題()你在comment提出:

一旦你顯示一個對話框:通過調用

setVisible(true); 

你隱藏:

setVisible(false); 

,然後你必須調用:

dialog.dispose(); 

,以確保所有本地的GUI資源使用的對話框被釋放。完成此操作後,垃圾收集器將在您不再引用任何對象時清除所有對象。

+0

以及如果它不是dialog.It可能是簡單的類?那麼你會建議的方式 – Sameer 2012-01-02 05:53:36

+0

如果它是一個簡單的類,然後它被垃圾回收器「銷燬」,一旦你不再有任何引用它。 – 2012-01-18 05:07:58

+0

我覺得也應該與對話類一樣發生。 – Sameer 2012-01-18 05:14:49

4

無需刪除對象。一旦垃圾收集器不再被引用,垃圾收集器就會處理內存。

+0

但我在裏面創建了jpanel的對話框,並且jpanel仍然會被引用。當我點擊我自己的按鈕「取消」時,我想銷燬該對話框 – joseph 2010-03-15 06:04:48

+0

因此,您可以將其設置爲空 – RubyDubee 2010-03-15 06:10:31

+0

@joseph:關閉時從對話框中刪除「JPanel」,如果您要繼續保持對該對話框的引用'JPanel'。這將阻止'JPanel'保持引用對話框並保持它(對話框)。 – 2010-03-15 06:14:41

2

你的意思是「如何」摧毀它?沒有辦法在Java中明確銷燬對象。 Java中的垃圾回收器自動回收它佔用的內存如果沒有引用相同的存在。

「但我創建的JPanel 對話框裏面,這JPanel的將是 仍然referrenced。我要摧毀 該對話框時,單擊我自己的按鈕 ‘取消’

試試看設置,JPanel的對象爲空或調用Dispose方法就可以了,如果可用

2

如果要刪除將該對象引用分配給null,以便垃圾收集器在下次運行時可以銷燬該對象,因爲它認爲它沒有被引用。

3

您可以覆蓋finalize()方法(請參見http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize%28%29)以在對象被銷燬時執行清理。

但是,與C++不同,不能保證何時調用此方法。在C++中,你有堆棧存儲的對象,這些對象在執行離開它們定義的範圍時被銷燬。

在Java中,所有對象都存儲在堆中。垃圾收集器決定收集它們時(意味着它們無法從您的應用程序訪問),但它們會在GC啓動時不知道。因此,如果您有必須在某個特定時間進行清理(例如,關閉文件以便寫入文件),則必須自己對其進行編碼,而不要依賴於調用的finalize()方法。

用於這樣做的典型模式是基於try ... finally塊上:

X x = null; 
try { 
    // ... do some stuff 
    x = ... // obtain an object 
    ... // do some stuff 
} 
finally { 
    if(x != null) 
    x.close(); // Perform cleanup WRT x 
} 

(誠然,難看)

2

沒有必要在C銷燬對象在Java中的方式類似++。垃圾回收器在運行代碼中沒有對該對象的引用後會自動銷燬(釋放內存使用的內存)。你所能做的所有事情是強制銷燬鏈接Object obj = null;這會殺死對obj的引用。

5
  1. 如果它是一個窗口,如果它是可見

    一frame.setVisible(假);

    二, frame.dispose();

    二,設定的基準爲空(例如..幀= NULL;)

  2. 如果它不是一個窗口

    I.set參考爲空(例如.. X = NULL;)

就是這樣,一旦對象被釋放,GC就會像那樣釋放資源

這裏有些事情您必須瞭解

*。您作爲Java程序員無法在Java中強制垃圾收集;只有JVM認爲它需要基於Java堆大小的垃圾回收時纔會觸發它。

*。有類似System.gc()Runtime.gc()這是用來發送垃圾收集請求到JVM,但不保證垃圾收集將發生。

*。如果在堆Java虛擬機創建新的對象沒有記憶空間拋出的OutOfMemoryError或java.lang.OutOfMemoryError堆空間

和搜索這個...

J2SE 5(Java 2標準版)增加了一個新功能稱爲人體工程學。人機工程學的目標是以最少的命令行調整從JVM提供良好的性能。

1

「System.gc()」是最好的方法。

gc-Garbage Collector。

這是你如何會破壞該計劃的對象本身

示例代碼:

public class TestRun 
{ 
    public static void main(String args[]) 
    { 
    /*1*/  TestRun tr=new TestRun(); 
    /*2*/  System.gc(); //You can omit this step. This is just an example. 
    /*3*/  tr=null;  
    /*4*/  System.gc(); 
    }  
} 

說明

  1. 類TestRun的目的是創建和它引用存儲在變量'tr'中。

  2. 垃圾收集器被調用。但不起作用。因爲還沒有對象被解除引用。

  3. 在步驟1中創建的對象現在已解除引用。但被物體佔據的空間仍然被它阻擋。

  4. 垃圾收集器再次被調用,現在它看到在步驟1中創建的對象現在被解除引用。因此,現在它釋放了對象所佔用的空間,並且該對象現在以簡單的語言從內存中刪除。

事實上,它會刪除所有已經解除引用的對象。

在代碼中繼續調用它是一個好習慣。