如何使用 Swing 在 Java 中正确实现 MVC?

如果您想了解更多详细信息,请告诉我,或参考本问题的最后几行。我已经读了很多书,我觉得我正在把一些简单的东西变成一些复杂的东西,我仍然被困在这里和那里,所以也许你可以在这些非常具体的地方帮助我。

我使用的是 Netbeans IDE 7 和 JDK 7,但没有框架。第一个窗口是一个JFrame,所有其他窗口都是modal=true的JDialogs。

问题:

  1. 如何正确实现带有 swing 的 MVC 模式?从下面的想法来看,哪一个更好:(A)或(B)?或者也许是另一个...为什么它更好?

    (一)主要:

    MyModel model
    MyView view(model)
    

    我的视图:

    MyController(this, model)
    

    (二)
    主要:

    MyModel model
    MyView View
    MyController controller(view, model)
    
  2. 当我在大型机中单击 jbutton1 时,我需要它来打开设置框架来编辑设置。我应该在哪里实例化设置帧的视图、模型和控制器?在大型机控制器中?

  3. 在MVC组织和实现方面,我应该如何处理(显然)缺少一个或两个MVC“腿”(模型或视图或控制器)的更具体的功能?我应该为他们创建空类吗?

    a. The implementation of a TrayIcon
    b. A URL connection class (an HttpsUrlConnection which will update data in the main jframe and also upload/download files)
    c. A Directory Monitor (which will update data in the main jframe and also use the urlconnection to download a file)
    d. My own implementation of TableModel
    e. json
    
  4. 如何在整个应用程序中正确保留和使用具有设置的对象?我将在不同位置(视图,模型,控制器)中需要它的信息,但它可能会在运行时被用户更改)。将此模型设置为单例是一个好主意吗?

  5. 当出现以下情况时,我该怎么办:

    a. View needs some data from the Model? 
    What I'm doing: using the reference of Model which I keep in the View
    b. View needs some data from the Controller?
    What I'm doing: using the reference of Controller which I keep in the View
    c. Model needs some data from the Controller?
    Still didn't happen but I have no idea how to do correctly
    d. Model needs some data from the View?
    What I'm doing: pulling all my hair from my head...
    e. Controller needs some data from the View?
    What I'm doing: using the reference of the View which I keep in the Controller
    f. Controller needs some data from the Model?
    What I'm doing: using the reference of the Model which I keep in the Controller
    g. One of FooModel, FooView or FooController needs data from one of BarModel, BarView or BarController?
    What I'm doing: thinking of jumping from the highest building...
    
  6. 关于如何知道我是否正确实现了MVC的任何提示?我应该在模型还是控制器中处理海量数据?

  7. 我也在使用DAO,我正在做的是:我的模型有一个

    ArrayList MyModel load()

    创建 DAO 实例并返回 DAO 返回的 ArrayList of Models 的方法,然后有时我在模型中处理此 ArrayList of Models,有时我允许控制器处理它。这是一种好的做法,还是有更好的方法?通过过程,我的意思是:循环访问ArrayList并从模型中获取数据。

  8. 我有一个密码检查jDialog来限制对某些视图的访问。我如何在MVC方面重用它,以便我可以使用相同的 PasswordCheck 对话框来允许/限制对不同视图的访问,而不会在代码中造成混乱?

  9. 还有其他提示,提示,想法,建议吗?

上下文:我需要在短时间内开发一个Java Swing MVC软件,尽管默认情况下我不是Java开发人员,也不习惯实现MVC模式,特别是在Java中(我明白这个想法,但有时它缺乏实现类之间关系的知识)。这些应用程序基本上是本地/在线文件的监视器,主框架中有一个JTable来显示此数据。我正在使用新的WatchService API来跟踪本地文件,并使用DAO将其信息保存在h2数据库中,然后它们在主帧jtable中重新加载此数据。我还必须通知用户有关新文件的信息(因为我使用的是TrayIcon)。对于在线文件监控/上传/下载,我使用的是HttpsUrlConnection和json。它还可能允许自定义设置。

提前感谢您的时间和帮助。


答案 1

看看Sun(Oracle)的建议

作为一种简化,您可以让每个组件(模型、视图、控制器)向顶级应用程序组件注册,以提供单个参考点,而不是在每个组件(A 或 B)之间提供单独的引用。我引用的文章提供了推拉设计的想法;我建议将推送作为一种更流行的现代方法。披露:我有Java和MVC的经验,但没有Swing本身的MVC经验。

我应该在哪里实例化设置帧的视图、模型和控制器?

当然,是的,或者在顶级应用程序组件中。

我应该如何处理(显然)缺少一个或两个MVC“腿”(模型,视图或控制器)的更具体的功能?

我会将仅 GUI 部分实现为您自己的 GUI 库。纯粹的算法/服务部分作为服务库。

我应该在模型还是控制器中处理海量数据?

数据处理算法非常适合控制器甚至服务库;您的模型除了可能的数据类型转换或验证之外,根本不应该做太多的处理。

如何在整个应用程序中正确保留和使用具有设置的对象?

见我关于注册的说明;单例可能是合适的。


答案 2

推荐