我製作了一個包含JButton的JFrame(稱爲J1
)。點擊該按鈕後,將打開一個新的JFrame(稱爲J2
)。 J1
也有一個ArrayList,其中包含J2
以及所有已打開的其他Jframe。 J2
設置爲DISPOSE_ON_CLOSED 我設置爲J2
a windowClosed()方法。爲了進行測試,在JFrame裏面我打了一圈ArrayList
,直到我剛剛關閉的當前J2
,並且出乎意料地當我做J2.setVisisble(true)
時,J2
窗口返回!如何完全關閉/刪除JFrame
我也查扔了任務管理器,看到雖然打開一個新的J2
,將會使整個程序消耗更多的內存,關閉每個J2
不顯示在任務管理器太大的區別,它看起來並不像任何內存都被釋放。看起來內存消耗在幾秒鐘後回到「正常」,所以我懷疑這與J2
有什麼直接關係。
我試圖打印(System.out.print
)所有ArrayList
每一個新J2
開始時間的內容,並打開窗戶,關閉它,並打開一個新的後,我得到以下messgae:
home.ATMmachine[frame0,252,198,620x420,invalid,hidden,layout=java.awt.BorderLayout,title=ATM Machine No.1,resizable,normal,defaultCloseOperation=DISPOSE_ON_CLOSE,rootPane=javax.swing.JRootPane[,9,38,602x373,invalid,layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],rootPaneCheckingEnabled=true]
這意味着J2
並未完全刪除!
JFrame中dispose()
方法是假設
釋放由此Window,其子組件所使用的本機屏幕資源,其擁有的所有兒童。也就是說,這些組件的資源將被銷燬,它們消耗的所有內存將被返回到操作系統,並且它們將被標記爲不可顯示。
所以,我只是錯了,框架被刪除累計時間後。
如果沒有,那麼我怎樣才能刪除框架以引用它的方式就像引用null?
'「關閉每個J2不顯示在任務管理器太大的差別,......」「 - 可能是因爲GC'ing需要的時候纔會出現,所以雖然您的對象被標記爲GC'ing,但可能因爲沒有必要已經被收集。在一個側面說明 - 爲什麼所有的JFrames?我用過的大多數程序都會給你帶來很多窗口,看起來很煩人,我想這就是爲什麼我通常只看到新手程序員以這種方式創建它們的原因。爲什麼不用CardLayout交換視圖? – 2014-09-29 21:19:29
'「J2.setVisisble(true)」' - 這裏不足爲奇。調用'dispose()'釋放資源。調用'setVisible(true)'重新創建並重新使用資源。你仍然有一個對象的引用,那麼如果你可以再次設置它,所以不會發生GC'ing。 – 2014-09-29 21:22:17
''這意味着J2沒有被完全刪除!「 - 你不想把對象與資源混淆,這正是你在這裏做的。您保留了對該對象的引用(否則println無法完成),因此它當然存在並且一直存在,直到引用不再存在(您不能打印任何內容),並且由於它繼續當然存在打印出來會返回你所看到的。 – 2014-09-29 21:27:00