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