簡體   English   中英

Java; 多個MVC和Swing關系的最佳實踐?

[英]Java; Multiple MVC and Swing Relationships Best Practice?

我正在嘗試使用帶有Observer / Observable的MVC設計范例來開發“人員數據庫” Java Swing應用程序。 這是我正在使用的M / V / C的簡化摘要:

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。

在實際的應用程序中,將有更多(和不同)的Model / View / Controller對象,但是我想保持這個示例簡單。

我不明白如何將這些單獨的視圖“合並”到一個UI中,同時又保持良好的關注點分離。

以PersonListView為例。 恕我直言,它不需要關心AppView(帶有JFrame等)。 PersonListView只需要看看自己的模式,並相應地更新自己 但是,我無法強制執行此操作,因為需要將PersonListView自己的Swing組件添加到另一個視圖AppView的Swing組件中。

因此,目前AppController實例化其自己的View,並間接實例化PersonView和PersonListView(通過其控制器的實例化)。 然后,AppController抓取每個視圖的“主” Jpanel,抓取應在AppView上添加的“父” Swing組件,然后添加它們。

對我來說,這似乎不是正確的方法。 我將與Swing相關的成員從他們的藏身處拉出來,並在控制器內部與他們搞混。 實際上,在控制器中實例化模型和視圖似乎也很糟糕,但是我想不出更好的方法。

我最近看過足夠多的“簡單MVC”教程,我夢dream以求,但似乎沒有一個教程涉及到多個模型,視圖,控制器之間的關系,尤其是涉及Swing的地方。 也許我錯了,該應用程序應該只有一個視圖? 也許我需要一個'Relationship'類,該類需要采用每個Model / View / Controller並適當地實例化某些東西?

我完全不知所措,任何建議將不勝感激!

這就是嚴格的MVC范式掉落的地方(無論如何在Swing中,這都可以解釋為什么以這種方式編寫Swing)。

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

我有一個開發人員,堅持使用嚴格的MVC方法,但他們仍然無法告訴我優先順序。 即控件應該知道視圖還是視圖應該知道控件-哪個插件插入另一個。 就個人而言,我很懶,只是遵循Swing的實現。

在我看來,如果您想遵循嚴格的MVC,我基本上會在控制器中允許使用一種允許訪問整個視圖的公共方法(例如,一個JPanel包含構成視圖的所有組件) 。

例如,考慮一下JComboBoxJSpinner 它們都有許多組成視圖的組件(編輯器,按鈕等),但是您只有一個訪問點,即組件本身...

下一個問題將是如何將各種視圖合並為一個整體視圖。

就個人而言,我將創建某種類型的組控制器,該組控制器允許您一起提供各種已知的控制器(例如setPersonList ),因為“主”控制器將需要以任何方式了解這些其他控制器,因為需要知道如何布置它們。

恕我直言

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM