如何在Java Swing中正确地在两个不同的MVC控制器之间进行通信?
你能解释一下Controller如何以简单但仍然正确的方式调用另一个Controller方法吗?
请提供一些代码!
背景:我有2个不同的Controller-View-Model和2个库,他们需要在彼此之间进行通信:
-
SettingsWindow / SettingsController / SettingsModel:负责应用程序设置。 该模型是单例,因为我需要整个应用程序的设置数据;
-
用于监视目录的库,每次在特定目录中创建文件时都会创建事件。 受监视的目录路径在SettingsModel中定义; 我正在使用Java 7 WatchService API;
-
用于监视Web服务器和下载新文件的库。 Web服务器地址和保存目录都在SettingsModel中定义; 我正在使用HttpsUrlConnection和一个计时器;
-
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.Preferences
或javax.jnlp.BasicService
讨论的javax.jnlp.BasicService
。