2015-04-01 47 views
1

我想編程一個swing應用程序,並學習一些關於mvc模式。另外我想保持我的Swing代碼清潔,所以我將我的GUI分成不同的類。 該類結構的一部分是這樣的:swing和mvc - 聽聽者的地方

//all classes extending BasicGuiElement 
-EntireContentElement has: 
---ControlElement has: 
------MainMenuElement 

MainMenuElement包含MainMenuBar,菜單的和的MenuItems。現在,不同的MenuItem需要不同的ActionListeners。

這裏是我的問題:這個ActionListener的來自哪裏?我應該在視圖中創建EntireControlElement,我傳遞一個HashMap並將所有元素傳遞給MainMenuElement。如果我有很多類都需要一堆動作偵聽器,我會傳遞一個偵聽器地圖列表?這將是非常醜陋的代碼,不是嗎?

另一種解決方案是將模型作爲模型接口傳遞給視圖,並從動作偵聽器中調用模型方法,這將在視圖類中創建......這是一種更好的方法嗎?

謝謝!

+1

的模型和視圖,一般來說,應該不知道對方的存在,並應通過控制器進行橋接,這意味着控制器應扮演觀察者的角色並回應適當的事件。你可以做的一件事就是在視圖和控制器之間定義一個契約,它描述了視圖可以執行的操作(甚至是一個通用的「菜單事件」),控制器可以對該操作作出反應。您可以直接在視圖中將'ActionListener'附加到您的組件中,然後將適當的事件觸發回控制器。 – MadProgrammer 2015-04-01 22:59:00

+1

類型的展示了這個想法[這裏](http://stackoverflow.com/questions/26517856/java-swing-where-do-actionlisteners-belong-according-to-mvc-pattern/26518274#26518274) – MadProgrammer 2015-04-01 22:59:23

回答

2

作爲@ MadProgrammer在他的評論中的一個很好的例子的替代品,有一個叫做MVP(Model-View-Presenter)的鮮爲人知的模式。它是傳統MVC的一個變體,其目標是使視圖儘可能愚蠢(沒有關於模型,控制器或任何其他應用程序代碼的知識或引用),以便所有要測試的代碼都不在GUI中。

要使用MVP回答您的問題,該模型是「獨立」的,並且對視圖或演示者/控制器一無所知。同樣,視圖也是「獨立的」,對模型或演示者/控制器一無所知。 Presenter是將觀察者邏輯注入視圖的橋樑。

對於比較/對比,有一個MVP示例可以是seen here, ,它是對MVC示例seen here的重寫。

參見:

Wiki: Model-View-Presenter

ObjectMentor: The Humble Dialog Box