Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA多重MVC和Swing关系最佳实践?_Java_Swing_Model View Controller - Fatal编程技术网

JAVA多重MVC和Swing关系最佳实践?

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

我正试图开发一个“个人数据库”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 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组件连接在一起。