2010-01-10 37 views
4

我有一個closeWindow()方法,它使用dispose()作爲當前JFrame關閉。當我再次顯示窗口時,控件(文本框,列表,表等)仍然有他們以前的值,當我處理()時,那裏有:d框架...爲什麼?是否有另一種方式來完成關閉和清除框架?Java Swing:dispose()JFrame沒有清除其控件

這是另一個JFrame用來顯示其他窗口的代碼,我在這裏做錯了什麼?

@Action 
public void showAddProductToOrderView() { 

    if (addProductToOrderView == null) addProductToOrderView = new AddProductToOrderView(this); 
    addProductToOrderView.setVisible(true); 
} 
+0

只是創建一個新的實例。 – 2010-01-10 13:40:11

+0

如果您看到上面添加的代碼,那麼在dispose()之後不是addProductToOrderView null:d?我怎樣才能確保變量被清除? – Johan 2010-01-10 13:47:56

回答

5

處置窗口不會清除其子文本組件。 Dispose將釋放本地資源。 javadoc java.awt.Window還聲明:

窗口及其子組件可以通過重新構建本地資源並隨後調用pack或show來再次顯示。重新創建的窗口及其子組件的狀態將與窗口所處位置處的這些對象的狀態相同(不考慮這些操作之間的額外修改)。

正如其他人所建議的,每次都要創建一個新實例。如果這是昂貴的,我相信你最好的選擇是在視圖變得可見時清除子組件,例如,通過重寫setVisible

編輯: 刪除空檢查每次創建一個新的框架。

@Action 
public void showAddProductToOrderView() { 
    addProductToOrderView = new AddProductToOrderView(this); 
    addProductToOrderView.setVisible(true); 
}

我不知道你的代碼的其餘部分,如果還有別的東西取決於被重用的幀。例如,如果您已附加偵聽器,請確保它們未註冊,以防泄漏。

+0

謝謝!如果你看看上面的代碼,那麼如果變量爲空,那麼每次都不會創建一個新實例?我想dispose()不會呈現變量null然後呢?如何在創建新實例之前每次清除該變量? – Johan 2010-01-10 13:59:51

+1

該變量不會被設置爲null,除非您自己在代碼中的某處執行該操作。處理框架只會釋放其原生資源(WindowPeer等),它不會影響對象的引用。刪除空檢查以每次創建一個新實例。 – 2010-01-10 14:04:41

+0

它的工作原理!非常感謝! – Johan 2010-01-10 14:52:03

3

做會使用show()再次顯示它之前重新創建整個幀(使用其構造函數)最簡單的事情。這會給你一套全新的組件,假設構造函數創建並放置它們。