当前位置: 首页 > 面试题库 >

Java MVC模式和Swing

柳英豪
2023-03-14
问题内容

我发现在“真实的Swing生活”中最难掌握的设计模式之一是MVC模式。我浏览了该站点上的很多文章,讨论了该模式,但是我仍然不太清楚如何在Java Swing应用程序中利用该模式。

假设我有一个JFrame,其中包含一个表,几个文本字段和一些按钮。我可能会使用TableModel将JTable与基础数据模型“桥接”。但是,负责清除字段,验证字段,锁定字段以及按钮操作的所有函数通常都直接在JFrame中。但是,这不是将模式的Controller和View混合了吗?

据我所知,当查看JTable(和模型)时,我设法“正确地”实现了MVC模式,但是当我整体查看整个JFrame时,事情就变得混乱了。

我真的很想听听其他人对此的看法。当你需要使用MVC模式向用户显示表格,几个字段和一些按钮时,如何处理?


问题答案:

我强烈推荐给MVC的书籍是Freeman和Freeman撰写的“ Head First Design Patterns”。他们对MVC有高度全面的解释。

简要总结

  1. 你就是用户-你与视图进行交互。视图是你进入模型的窗口。当你对视图执行某些操作(例如单击“播放”按钮)时,视图将告诉控制器你做了什么。处理该任务是控制器的工作。

  2. 控制器要求模型更改其状态。控制器执行你的动作并解释它们。如果单击按钮,则控制器的工作就是弄清楚这意味着什么以及如何基于该操作来操纵模型。

  3. 控制器也可能要求视图更改。当控制器从视图接收到一个动作时,它可能需要告诉视图作为结果进行更改。例如,控制器可以启用或禁用界面中的某些按钮或菜单项。

  4. 当状态改变时,模型会通知视图。当模型中的某些内容发生更改时,根据你执行的某些操作(例如单击按钮)或其他内部更改(例如播放列表中的下一首歌曲已开始),该模型会通知视图其状态已更改。

  5. 视图向模型询问状态。该视图直接从模型获取其显示的状态。例如,当模型通知视图新歌曲已开始播放时,该视图向模型请求歌曲名称并显示它。由于控制器请求对视图进行某些更改,因此视图可能还会向模型询问状态。

在此处输入图片说明 来源(如果你想知道“奶油控制器”是什么,请考虑一个奥利奥饼干,其中控制器是奶油中心,视图是顶部饼干,模型是底部饼干。)

嗯,如果你有兴趣,可以从这里下载有关MVC模式的相当有趣的歌曲!

Swing编程可能会遇到的一个问题是将SwingWorker和EventDispatch线程与MVC模式合并。根据你的程序,你的视图或控制器可能必须扩展SwingWorker并覆盖doInBackground()放置资源密集型逻辑的方法。这可以很容易地与典型的MVC模式融合,这是Swing应用程序的典型特征。

编辑#1:

此外,将MVC视为各种模式的组合非常重要。例如,可以使用观察者模式(需要将视图注册为模型的观察者)来实现模型,而控制器可以使用策略模式。

编辑#2:

另外,我想特别回答你的问题。你应该在View中显示表格按钮等,这显然会实现一个ActionListener。在你的actionPerformed()方法中,你将检测到事件并将其发送到控制器中的相关方法(请记住,该视图包含对控制器的引用)。因此,当单击按钮时,视图会检测到事件,并将其发送到控制器的方法,控制器可能会直接要求视图禁用按钮或其他操作。接下来,控制器将与模型交互并修改模型(该模型将主要具有getter和setter方法,以及一些其他方法来注册和通知观察者,依此类推)。修改模型后,它将立即调用已注册观察者的更新(在你的情况下为视图)。因此,视图现在将自行更新。



 类似资料:
  • 网络.xml 控制器 当我访问 http://mydomain/car/baojia.html 并出现此错误时: spring.xmlViewResolver 我在/views/boajia.jsp中有一个文件 不管我写什么,都不行 我还有另一个问题,我不想匹配这个 url 模式:/api/*,控制器是: 但它不能工作

  • 有人有一个通用的例子吗?通过看到这样的例子,一定会明白我们真的需要使用代理模式吗

  • 问题内容: 我最近正在读《 学习JavaScript设计模式》 这本书。我没有得到的是模块模式和显示模块模式之间的区别。我觉得他们是同一回事。有人可以举一个例子吗? 问题答案: 至少有三种不同的方法来实现模块模式,但是显示模块模式是唯一具有正式名称的模块模式后代。 基本模块模式 模块模式必须满足以下条件: 私有成员住在封闭中。 公共成员暴露在返回对象中。 但是这个定义有很多歧义。通过以不同方式解决

  • 问题内容: 我已经使用具有继承性的Java绑定搜索了json模式,并且所有搜索都导致我使用“ allOf”。 使用allOf可能会解决我的问题,但我想知道json模式中是否有可以使用的构造,该构造将生成具有真实Java继承“ B扩展A”的Java代码- 而不是在B内插入A的所有属性? 我想知道这是否被支持/可行,或者我只是在做梦。如果不支持,我很想知道原因。 问题答案: 好吧,我是两者的作者: 当

  • 我现在正在使用JAXB,我正在努力注释我的前置条件查询的复合概念,以便JAXB会满意。 前提条件查询可以是: 简单:只有一个包含查询的文本节点 化合物 OR:1个前置条件查询的前置条件OR其他匹配 AND:1个前置条件查询的前置条件与其他匹配 当然,复合查询可以由复合查询组成,就像下面的例子一样: 在我的Java模型中,我有一个带注释的接口PreconditionQuery(实际上是一个抽象类,因

  • 若要开始使用服务器对象,你应该创建并打开一个连接。如果服务器中没有任何对象,你需要创建一个新的数据库或/和一个新的模式。 创建一个新的数据库 在导航窗格中,右击连接并选择“新建数据库”。 在弹出的窗口中输入数据库的属性。 编辑一个现有的数据库 在导航窗格中,右击数据库并选择“编辑数据库”。 在弹出的窗口中编辑数据库的属性。 创建一个新的模式 在导航窗格中,右击数据库并选择“新建模式”。 在弹出的窗