JAVA Swing MVC – 主控制器?

我在设计我正在尝试开发的应用程序的架构时遇到了一些麻烦。 我正在研究JAVA,我开始研究这个应用程序,因为我想加深我对JAVA,架构和模式的整体了解。 我想按照指南来制作一个可重用,低耦合的应用程序,就像它应该的那样。 该应用程序只有一个JFrame,但在其中有几个JPanel,每个JPanel代表一个应用程序的模块。

问题是:在JAVA Swing中,如何实现适当的MVC模式? 我在如何理解它应该如何完成的方式上挣扎。

我应该有一个主控制器类,它包含对所有其他控制器的引用吗? (我有一张图片来certificate这一点,在这里: https : //docs.google.com/file/d/0B7tBdn5slIFeY2FoSmxESTREQ1k/edit?usp =sharing )

在这种情况下,是否所有需要更改正在呈现的模块的事件都会重定向到主控制器?

或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信?

基本上,我想知道我是否需要一个“管理”所有其他课程。 我已经阅读了几个解释和不同意见,但我相信这有点具体。

希望我已经清楚了(并且希望我的解释比我的绘图更好:))。

编辑:应用程序用法的示例:

  • 应用程序的整个生命周期中的一个(仅一个)JFrame;
  • 菜单将在左侧,如BorderLayout.WEST;
  • 应用程序的当前模块将位于中心,如BorderLayout.CENTER;
  • 当用户按下菜单的一个按钮时,相应的模块被加载到BorderLayout.CENTER;

菜单(View)是否应该拥有自己的Controller,并且此Controller与JFrame通信? JFrame将新模块加载到它的布局中? 或者JFrame应该有自己的控制器(或模型,如Gilbert Le Blanc所说)?

我知道这似乎具体或易于理解,但每当我想到桌面应用程序时,我都很难理解这一点。

当您拥有带GUI的应用程序时,GUI模型将成为应用程序视图。 应用程序通过GUI模型与GUI交互。

或者我应该将JFrame与应用程序的控制器耦合,并直接与它们通信?

这就是我所做的。 我已将控制器类打包在一起,但我从未创建过一个主控制器类。

我将GUI控制器类保存在与任何其他应用程序控制器类(如数据访问对象)不同的独立包中。

我通常将每个JPanel放在自己的类中,但我不会称之为要求。 JFrame有自己的类,尽管JFrame的实例和GUI模型的实例几乎都传递给了所有的GUI组件。 这使得菜单操作成为可能。

此交通信号GUI文章介绍了如何编写非常简单的GUI的基础知识。

编辑回应问题的变化。

GUI控制器与GUI模型分开。 GUI模型包含构成GUI的所有数据元素。 JTextField的字符串,JTable的DefaultTableModels。

根据您的应用程序设计,我建议您为要放在应用程序中心的每个JPanel创建一个Java类。 您的JFrame将根据菜单控制显示哪个JPanel。 我还建议您查看使用不同用户界面的JTabbedPane来完成选择使用哪个面板的任务。

假设您正在使用左侧的菜单,每个菜单选项(切换JButton?)将拥有它自己的控制器方法或类。 这些控制器必须具有JFrame的实例,因此控制器可以调用JFrame类中的方法,该方法将适当的面板放在显示器的中心。 控制器决定调用哪个方法,但方法本身是JFrame类的一部分。

我一直在谈论JFrame和JPanel类。 使用组合而不是inheritance来构建这些类非常重要。 JFrame类包含一个JFrame。 它不会扩展JFrame。 扩展Swing组件的唯一时间是您要覆盖组件方法。

如此处所讨论的,Swing组件使用可分离的模型体系结构 ,模型和视图使用观察者模式松散耦合。 并非每个GUI控件都必须是应用程序控制器的一部分。 使用ActionListener (如Action对于封装应用程序function特别方便。

附录:我使用CardLayout , 这里说明切换面板。 注意Action处理程序如何与按钮,菜单,组合,工具栏等一起使用。每个卡的内容都可以拥有自己的MVC模式实现,与其他模式分开。 使用此处显示的PropertyChangeEvent进行组件之间的通信。

通常,Swing组件(例如按钮和表格)已经收听了各自的模型,让您专注于应用程序的数据模型及其监听视图。 方便地,Swing模型(例如ComboBoxModelTable Model`)可以具有多个侦听器。