2013-05-07 53 views
0

我正在嘗試開發一個「Person數據庫」Java Swing應用程序,使用Observer/Observable使用MVC設計範例。以下是我正在使用的M/V/Cs的簡化摘要:Java;多個MVC和Swing關係最佳實踐?

App 
    AppModel 
     (Empty right now, possibly i'll store certain static application info such as version number here) 
    AppView 
     (Creates a JFrame and a few other Swing components) 
    AppController 
     (Instantiates AppModel, AppView and also a PersonController and a PersonListController) 

Person 

    PersonModel 
     (Stores info for 1 person) 

    PersonView 
     (Displays a number of form fields inside a JPanel (i.e Name, Age, Phone number). Observes PersonModel.) 

    PersonController 
     (Instantiates PersonView. Observes PersonView. Instantiates PersonModel. Updates PersonModel.) 

PersonList 

    PersonListModel 
     (Stores a list of Persons) 

    PersonListView 
     (Displays a list of persons with appropriate Add/Delete buttons. Observes PersonList.) 

    PersonListController 
     (Instantiates PersonListView. Observes PersonListView. Instantiates PersonListModel. Updates PersonListModel) 

另外,應用程序啓動的'引導程序'。它創建一個新的AppController。

在實際的應用程序中,會有更多(和不同的)模型/視圖/控制器對象,但我希望這個例子保持簡單。

我不明白我能如何將這些獨立的視圖合併到一個用戶界面中,同時保持良好的分離關注點。

以PersonListView爲例。恕我直言,它不需要關心的AppView(與JFrame等)。 PersonListView只需要查看其自己的型號並相應地更新本身。但是,我無法強制執行此操作,因爲PersonListView自己的Swing組件需要添加到另一個視圖的AppView的Swing組件中。

因此,目前AppController正在實例化自己的視圖,並間接加入了一個PersonView和PersonListView(通過控制器的實例化)。 AppController然後爲每個視圖抓取'主'Jpanel,抓取它們應該添加到AppView上的'父'Swing組件,並添加它們。

這似乎並沒有正確的方式來做到這一點。我將擺動相關的成員從他們的藏身處拖走,並在控制器內部與他們搞混了。實際上,在控制器中實例化模型和視圖看起來不太好,但我無法找出更好的方法。

我最近看到足夠的'簡單的MVC'教程,我夢想着血腥的事情 - 但似乎沒有一篇教程涉及多個模型,視圖,控制器的關係,特別是涉及Swing的關係。也許我錯了,應用程序應該只有一個視圖?也許我需要一個'關係'類,它需要每一個模型/視圖/控制器並適當地實例化東西?

任何意見,將不勝感激,因爲我完全茫然!

回答

1

這是一個嚴格的MVC範式下降(無論如何,在Swing中,這也許可以解釋爲什麼Swing是這樣寫的)。

Swing將視圖元素和控制元素組合在一起,使模型分離。這意味着,您可以自由地將視圖添加到任何其他視圖,然後控制(模型保持動態)。

我有一個開發人員堅持使用嚴格的方法來MVC,他們仍然不能告訴我的優先順序。也就是說,控制是否應該知道視圖或視圖是否知道控件 - 哪一個插入到另一個控件中。就我個人而言,我懶惰,只需遵循Swing實現。我想,如果你想遵循一個嚴格的MVC,我基本上允許在你的控制器的公共方法,允許訪問整體視圖(說一個JPanel所有的組件,例如查看)。例如,考慮JComboBoxJSpinner。它們都有許多構成視圖的組件(編輯器,按鈕等),但是您有單一的訪問點,組件本身......

您的下一個問題將是如何將各種視圖合併成一個視圖。因爲「主」控制器需要了解這些其他控制器,所以我會創建一個允許您將各種已知控制器一起提供給某種類型的組控制器(例如,setPersonList)因爲它需要知道如何佈置它們。

恕我直言

+0

感謝您的意見,我將嘗試像您所建議的那樣實施組控制器。我想我會讓它在程序中實例化所有MVC,然後根據需要將每個視圖的Swing組件連接在一起。 – user2359111 2013-05-08 13:38:59