我认为这对我来说不是一个特定的问题;每个人之前可能都遇到过这个问题。为了正确地说明它,这是一个简单的 UI:
如您所见,这两个微调器正在控制一个变量——“A”。唯一的区别是他们使用不同的视图来控制它。
由于这两个微调器的显示值是同步的,因此会出现循环事件。
如果我更改顶部微调器,“A”将被更改,底部微调器的值也将相应更新。但是,更新底部微调器的调用(例如 setValue)也会触发另一个事件,指示顶部微调器根据底部微调器的值进行更新。因此创建了一个坏循环,最终可能导致 StackOverFlow 异常。
我之前的解决方案有点麻烦:我放置了一个保护布尔值来指示是否应该执行第二次更新调用。
现在我想问“我怎样才能优雅地处理这种情况?(一般来说,不是特定于微调器)”
谢谢
更新:
由于我有 2 个答案建议我使用观察者结构,因此我不得不说一下。
就像我所说的那样,它很棒,但远非完美。不仅因为其固有的复杂性,而且还因为它无法解决问题。
为什么?要了解原因,必须实现 Java Swing 中 View 和 Model-Controller 的紧密耦合。让我们以我的微调器 UI 为例。假设变量 A 实际上是一个 Observer 对象。然后,在从顶部微调器触发第一个状态更改事件后,观察者“A”将更新其值并触发 PropertyChange 事件以通知底部微调器。然后是第二次更新,它更新了底部微调器的视图。但是,更改底部微调器的视图不可避免地会触发一个冗余事件,该事件将尝试再次设置“A”的值。之后,完全构建了致命循环,将抛出堆栈溢出。
理论上,观察者模型试图通过引入 2 条独立的反馈路径来解决直接循环。链式更新几率(在事件响应代码中)隐含地形成了连接两条路径的桥梁,再次形成一个循环。