JavaMVC:使用观察者模式更新视图

JavaMVC:使用观察者模式更新视图,java,model-view-controller,swing,Java,Model View Controller,Swing,在我的应用程序中,我有视图,它观察模型的变化控制器负责处理视图发送的事件,并更新模型 为了举例,让我们假设我有两个视图。首先,InputView,包含两个JSpinner元素(Spinner1和Spinner2)。其次,ResultView,包含带有微调器值的JLabel。作为附加约束,我们希望喷丝头2的值取决于喷丝头1的值。假设喷丝头2中的最小值应为2x喷丝头1的当前值 当我们更改喷丝头1的值时,控制器接收更改事件并更新型号。由于我们还必须调整Spinner2的值,另一个ChangeEvent

在我的应用程序中,我有
视图
,它观察
模型
的变化<代码>控制器负责处理
视图
发送的事件,并更新
模型

为了举例,让我们假设我有两个视图。首先,
InputView
,包含两个
JSpinner
元素(
Spinner1
Spinner2
)。其次,
ResultView
,包含带有微调器值的
JLabel
。作为附加约束,我们希望
喷丝头2
的值取决于
喷丝头1
的值。假设
喷丝头2
中的最小值应为
2x
喷丝头1的当前值

当我们更改
喷丝头1的值时,
控制器
接收
更改事件
并更新
型号
。由于我们还必须调整
Spinner2
的值,另一个
ChangeEvent
将被调度,并且
模型将第二次更新。此模式的问题在于,对于每个
模型
更新视图
刷新。因此,在此示例中,
视图将刷新3或4次,而不是一次(
喷丝头1
更改,
喷丝头2
最小值更改,
喷丝头2
值更改)。这会导致闪烁

如何确保所有更改完成后,
视图只更新一次?

显示:

“谁触发了更新?主体及其观察者依靠通知机制保持一致。但什么对象实际调用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.
第二个选项可能对您有用。

说明:

“谁触发了更新?受试者及其观察者依靠通知机制保持一致。但是什么对象实际调用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.

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

本文将问题置于上下文中,并建议使用属性更改“对照Swing组件中存储的当前值检查模型的传入更改值。”

本文将问题置于上下文中,并建议使用属性更改“对照Swing组件中存储的当前值检查模型的传入更改值。”

因此,观察是这样做的:

label -> spinner 2 -> spinner 1
如果我是你,我会设置“更改类型”。这样,在我的控制器中,我可以控制如何通知我的观察者


如果您发布您的代码,我会更有帮助。

这就是观察的方式:

label -> spinner 2 -> spinner 1
如果我是你,我会设置“更改类型”。这样,在我的控制器中,我可以控制如何通知我的观察者


如果您发布代码,我会更有帮助。

请发布一个SSCC,因为我不知道闪烁,您的代码中肯定存在另一个重复问题。闪烁是指视图的后续刷新。如果我们使用某种图表或任何比标签更复杂的东西,则会注意到多次刷新请发布SSCCE、 因为我不知道闪烁,你的代码中肯定有另一个重复的问题。闪烁指的是视图的后续刷新。如果我们使用某种图表或任何比标签更复杂的东西,会注意到多次刷新。o,
label
观察
Model
。带有微调器的面板也观察到“模型”。每个
微调器
状态更改
分派到
控制器
,该控制器修改
模型
。此时
输入视图
更新从属
微调器2
的值,从而触发
模型
更新的第二波nners还观察“模型”。每个
微调器
状态更改
分派给
控制器
,控制器修改
模型
。此时
输入视图
更新从属
微调器2
的值,触发
模型
更新的第二波