我正在尝试使用带有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)
此外,应用程序启动的'bootstrap'。它创建了一个新的AppController。
在实际应用程序中,会有更多(和不同的)模型/视图/控制器对象,但我希望保持这个示例的简单。
我不明白如何将这些单独的观点“合并”到一个用户界面中,同时保持良好的关注分离。
以PersonListView为例。恕我直言,它不需要关心AppView(与JFrame等)。 PersonListView只需要查看其自己的模型并相应地更新本身。但是,我不能强制执行,因为PersonListView自己的Swing组件需要添加到另一个视图的Swing组件AppView。
所以目前AppController正在实例化它自己的View,间接加上PersonView和PersonListView(通过实例化它们的控制器)。然后AppController抓取每个视图的“主”Jpanel,抓取应该添加到AppView上的“父”Swing组件,然后添加它们。
这对我来说似乎没有正确的方法。我将Swing相关的成员从他们的藏身处拉出来,并在控制器内乱搞他们。实际上在控制器中实例化模型和视图似乎也很糟糕,但我无法找到更好的方法。
我最近看到了很多'简单的MVC'教程我正在梦想着血腥的东西 - 但是没有一个教程似乎涉及多个模型,视图,控制器的关系,特别是涉及Swing的地方。也许我错了,应用程序应该只有一个视图?也许我需要一个“关系”类,它可以采用每个模型/视图/控制器并适当地实例化它们?
任何建议都会受到最高的赞赏,因为我完全不知所措!
答案 0 :(得分:1)
这是一个严格的MVC范式倒下的地方(无论如何都在Swing中,这可能解释了为什么Swing的编写方式)。
Swing将视图和控制元素组合在一起,使模型分离。这意味着,您可以自由地将视图添加到任何其他视图,并且控件如下(模型保持动态)。
我有一个开发人员坚持使用严格的MVC方法,他们仍然无法告诉我优先顺序。也就是说,控件应该知道视图还是视图应该知道控件 - 哪一个插入另一个控件。就个人而言,我很懒,只是按照Swing实现。
在我看来,如果你想遵循一个严格的MVC,我基本上允许你的控制器中的一个公共方法允许访问整个视图(比如JPanel
,其上包含所有组件例如,构成视图。
例如,考虑JComboBox
或JSpinner
。它们都有许多构成视图的组件(编辑器,按钮等),但是你有单个访问点,组件本身......
您的下一个问题是如何将各种视图合并到一个视图中。
就个人而言,我会创建一种某种类型的组控制器,允许您将各种已知的控制器一起提供(例如setPersonList
),因为“主”控制器需要知道这些其他控制器,因为它需要知道如何布局它们。
IMHO