如何在Java Swing中正确地在两个不同的MVC控制器之间进行通信?

你能解释一下Controller如何以简单但仍然正确的方式调用另一个Controller方法吗?

请提供一些代码!

背景:我有2个不同的Controller-View-Model和2个库,他们需要在彼此之间进行通信:

  1. SettingsWindow / SettingsController / SettingsModel:负责应用程序设置。 该模型是单例,因为我需要整个应用程序的设置数据;

  2. 用于监视目录的库,每次在特定目录中创建文件时都会创建事件。 受监视的目录路径在SettingsModel中定义; 我正在使用Java 7 WatchService API;

  3. 用于监视Web服务器和下载新文件的库。 Web服务器地址和保存目录都在SettingsModel中定义; 我正在使用HttpsUrlConnection和一个计时器;

  4. MainWindow / MainController / MainModel:负责主应用程序窗口,该窗口具有必须在每次在受监视目录中创建新文件时更新的表,以及每次上述库下载文件时。

那么如何正确实例化和传达这4种不同的function呢?
他们的控制器如何在它们之间进行通信,因为它们都是相关的? 我应该如何根据MVC组织这个项目?

请提供基本的MVC脚手架(骨架)并显示我在哪里创建实例,在哪里以及如何调用彼此方法。 我是Java新手,特别是swing和mvc。 我已经阅读了很多,但我陷入了这种情况。

正如这里所建议的那样, 模型 – 视图 – 控制器观察者模式代表了重复出现的设计元素。 一个简单的大纲可以说明类的交互,但一般的解决方案超出了StackOverflow的范围。

不过,看看如何应用这些原则可能会有所帮助。 假设您正在学习本教程并在SwingWorker实现了WatchService ,如下所示。 现在,假设您希望主视图( JTable )更新自身以响应到达的WatchEvent 。 您可以安排相应的TableModel将worker自身注册为PropertyChangeListener ,如此处和此处所示。 当PropertyChangeEvent到达时,您更新TableModel并触发相应的事件以更新JTable 。 已知的TableModel实现已包含所需的方法。

将使用类似的方法来更新表以响应来自Web的数据。

对于设置,请考虑此处提到的java.util.Preferencesjavax.jnlp.BasicService讨论的javax.jnlp.BasicService