一尘不染

Java MVC模式和Swing

java

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

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

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

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


阅读 820

收藏
2020-03-08

共1个答案

一尘不染

我强烈推荐给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方法,以及一些其他方法来注册和通知观察者,依此类推)。修改模型后,它将立即调用已注册观察者的更新(在你的情况下为视图)。因此,视图现在将自行更新。

2020-03-08