JAVA多重MVC和Swing关系最佳实践?
我正试图开发一个“个人数据库”JavaSwing应用程序,使用MVC设计范式和Observer/Observable。以下是我使用的M/V/Cs的简化摘要:JAVA多重MVC和Swing关系最佳实践?,java,swing,model-view-controller,Java,Swing,Model View Controller,我正试图开发一个“个人数据库”JavaSwing应用程序,使用MVC设计范式和Observer/Observable。以下是我使用的M/V/Cs的简化摘要: 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
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
在实际应用程序中,将有更多(和不同)的模型/视图/控制器对象,但我希望保持这个示例的简单性
我不明白如何将这些独立的视图“合并”到一个UI中,同时保持关注点的良好分离
以PersonListView为例。IMHO它不需要关心AppView(使用JFrame等)。PersonListView只需要查看自己的模型并相应地更新自己。但是,我无法强制执行该操作,因为PersonListView自己的Swing组件需要添加到另一个视图AppView的Swing组件中
因此,目前AppController正在实例化它自己的视图,并间接地加上PersonView和PersonListView(通过实例化它们的控制器)。AppController然后为每个视图抓取“主”Jpanel,抓取它们应该添加到AppView上的“父”Swing组件,并添加它们
这对我来说似乎不是个好办法。我把和Swing相关的成员从他们的藏身处拉出来,在控制器里和他们乱搞。事实上,在控制器中实例化模型和视图似乎也很糟糕,但我想不出更好的方法
最近,我已经看过足够多的“简单MVC”教程,我梦想着这些血腥的东西——但似乎没有一个教程涉及到多个模型、视图、控制器之间的关系,特别是在涉及Swing的地方。也许我错了,应用程序应该只有一个视图?也许我需要一个“关系”类,它接受每一个模型/视图/控制器,并适当地实例化这些东西
任何建议都将不胜感激,因为我完全不知所措 这就是严格的MVC范例的失败之处(无论如何,在Swing中,这可能解释了为什么Swing是这样编写的) Swing将视图和控件元素组合在一起,使模型保持独立。这意味着,您可以自由地将视图添加到任何其他视图中,控件也随之添加(模型保持动态) 我有一个开发人员坚持使用严格的MVC方法,但他们仍然不能告诉我优先顺序。ie控件应该知道视图还是视图应该知道控件-哪个插件插入到另一个。就我个人而言,我很懒惰,只是简单地遵循Swing实现 在我看来,如果你想遵循严格的MVC,我基本上会在你的控制器中允许一个公共方法,允许访问整个视图(比如说一个
JPanel
,上面有组成视图的所有组件)
以JComboBox
或JSpinner
为例。它们都有许多组成视图的组件(编辑器、按钮等),但您只有一个访问点,组件本身
您的下一个问题将是如何将各种视图组合成一个整体视图
就个人而言,我会创建一个某种类型的组控制器,允许您一起提供各种已知的控制器(setPersonList
),因为“主”控制器需要以任何方式了解这些其他控制器,因为它需要知道如何布局它们
IMHO感谢您的投入,我将尝试实现您建议的组控制器。我想我会让它实例化程序中的所有MVC,然后让它根据需要将每个视图的Swing组件连接在一起。