Java MVC : Updating View using Observer pattern

标签 java model-view-controller swing

在我的应用程序中,我有View来观察Model的变化。 Controller 负责处理 View 分派(dispatch)的事件并更新 Model

为了举例,假设我有两种观点。首先,InputView 包含两个 JSpinner 元素(Spinner1Spinner2)。其次,ResultView 包含带有来自微调器的值的 JLabel。作为附加约束,我们希望 Spinner2 的值依赖于 Spinner1 的值。可以说,Spinner2 中的最小值应该是 Spinner1 当前值的 2x

当我们更改Spinner1的值时,Controller接收ChangeEvent并更新Model。由于我们还必须调整 Spinner2 的值,因此将调度另一个 ChangeEvent 并第二次更新 Model。此架构的问题在于,每次 Model 更新时,观察的 View 都会刷新。因此,在此示例中,View 将刷新 3 或 4 次,而不是一次(Spinner1 更改、Spinner2 最小值更改、Spinner2 值变化)。这会导致闪烁。

如何确保在所有更改完成后 View 仅更新一次?

最佳答案

gang-of-four book说:

“谁触发更新?主体和它的观察者依靠通知机制保持一致。但是什么对象真正调用Notify来触发更新?这里有两个选择:

Have state-setting operations on Subject call Notify after they change the 
subject's state. The advantage of this approach is that clients don't have 
to remember to call Notify on the subject. The disadvantage is that several
consecutive operations will cause several consecutive updates, which may be
inefficient.

Make clients responsible for calling Notify at the right time. The advantage 
here is that the client can wait to trigger the update until after a series 
of state changes has been made, thereby avoiding needless intermediate updates.
The disadvantage is that clients have an added responsibility to trigger the 
update. That makes errors more likely, since clients might forget to call Notify.

第二个选项可能对您有用。

关于Java MVC : Updating View using Observer pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777910/

相关文章:

java - 如何在 Java 中绘制二维图形?

java - 使用@Query 注释按名字排序数据库信息不起作用,我该如何解决?

javascript - 如何从 s :hidden tag in Struts 2 获取 jQuery 中的对象列表

java - 来自单个对象的接口(interface)集合

javascript - 我如何纠正 $injector :unpr error with Angular 1. 6/MVC 4.6/UI-Grid

model-view-controller - ExtJs MVC 中 on 和 mon 的区别

java - java中的KeyAdapter输入不起作用

java - 我想使用 Swing 计时器对 SQL 表进行查询,为返回的结果设置 Swing 标签。这是行不通的

java - 具有可变长度字段的详细信息 JPanel

java - 无法使用 Maven 插件读取 Docker 内的用户输入