2012-10-25 134 views
2

我正在編碼MVC。在我的控制器中,我正在監聽該動作,如果用戶單擊「顯示列表」按鈕,我正在製作一個從JFrame擴展視圖類的實例,並在其中創建一個新的JFrame。我的問題是,如果我多次點擊SHOW-LIST按鈕,我會打開多次框架。誰能告訴我我怎麼可以這樣做,因此,一旦一個新的框架即將開啓舊框框關閉..如何在打開新框架時關閉前一個框架

控制器

public void actionPerformed(ActionEvent event) { 
    String viewAction = event.getActionCommand(); 
    ... 
    if (viewAction.equals("SHOW-LIST")) { 
     showListUI = new ShowListDialogUI(displayedCustomerList); 
    } 
} 

查看

class ShowListDialogUI extends JFrame{ 
    public ShowListDialogUI (List<Customer> customerList) { 
    .. 
    // I am drawing it here 
    .. 
    } 
} 
+2

參見[*多JFrames的用途,好/ Bad Practice?*](http://stackoverflow.com/q/9554636/230513) – trashgod

回答

3

有人能告訴我怎樣才能做到這一點,這樣一旦一個新的幀 即將開啓舊框框關閉..

  • 使用CardLayout,那麼沒有理由玩Top-Level Container s,放在那裏需要的號碼JPanels,然後只是在JPanel視圖之間切換

  • @trashgod通知,還真沒好主意,辦法

  • 否則必須清理(刪除所有內容)uselless容器,because Top-Level Containers never will be GC'ed

+0

+1一如既往的好建議 –

1

嘛,要看用例,但不是關閉舊的,而是創建新的,你可以集中現有的(可能更新數據?)。

您的控制器可以管理這些幀並對其進行跟蹤。在最簡單的(不推薦)方式中,你有一個布爾型的「isFrameOpen」。如果打開框架,則將其設置爲true;如果關閉框架,則將其設置爲false(您的框架必須與控制器通信,或者控制器必須至少知道框架的狀態)。如果布爾值爲true,則重點/重新創建它。如果爲false,則創建一個新的。

在更高級的解決方案中,您可以使用地圖跟蹤所有幀,並且您必須認真處理併發訪問。

--tb

+0

你提出的想法很好,但是爲什麼當'JFrame'本身從'Window'獲得這個方法時使用布爾變量類,稱爲[isShowing()](http://docs.oracle.com/javase/7/docs/api/java/awt/Window.html#isShowing())。 +1的想法,但不是你應用的技術:-) –

+0

@GagandeepBali我完全同意,這就是我寫道「(而不是推薦)」的原因:)這是爲了容易理解。 –

相關問題