【问题标题】:Using OO Observer pattern without updating object from which change originated使用 OO 观察者模式而不更新更改源自的对象
【发布时间】:2013-01-31 10:46:27
【问题描述】:

我正在构建一个包含 GUI 和模型的应用程序。当模型中的字段发生更改时,我正在使用观察者模式(使用 java 的内置接口)来更新 GUI。

这通常工作正常,但我有一种情况,模型中的特定字符串变量(特别是文件的 url)可以由两个单独的 JTextFields(swing)更改,其内容实际上反映了有问题的模型变量。

我遇到的问题来自这样一个事实,即其中一个 JTextField 的更改需要更新模型的状态以及另一个 JTextField 的内容。我的模型确保仅在模型状态发生变化的情况下才向观察者发送通知。但是,修改 JTextFields 的过程涉及将其文本内容清空然后重置它。

无需过多介绍,其结果是更新/通知过程陷入无限循环。我暂时通过为这个特定问题搁置观察者模式来解决这个问题,但我想知道是否有人可以提出一种巧妙的方法来确保特定组件不会被源自同一组件的更改“更新”。

任何帮助表示赞赏。

【问题讨论】:

  • 修改 JTextFields 的过程包括将其文本内容置空然后重新设置。 为什么需要将其置空?这听起来像你的问题的根源。无论如何,最简单的解决方案是比较文本字段内容和“未来”文本内容并忽略通知是两个值相等。
  • 我完全同意 mKorbel 的 comment - 尝试设计一个 SSCCE 来证明问题。它可能会帮助您自己解决问题,并且一定会帮助我们帮助您。

标签: java swing oop jtextfield observer-pattern


【解决方案1】:

正如Java SE Application Design With MVC 中所讨论的,这是几个Issues With Application Design 之一。建议的方法依赖于PropertyChangeListener,图示为herePropertyChangeEvent 包含旧值和新值以供参考。

【讨论】:

    【解决方案2】:

    这个link 谈论双向观察者可能会在这方面提供一些帮助。

    在您的情况下,模型和视图似乎正在尝试相互更新。解决方案在于执行更新的方向。例如 Inner layer -> Model -> ViewView -> Model -> 内层。所以它并不是真正的观察者模式。

    java.util.Observerupdate(Observable o, Object arg) 方法确实接受 Observable(Subject) 对象。该对象可用于向模型提供提示,要求它向内而不是向视图传播更新。

    我快速尝试了一下,发现设置双向观察者(使用 Java api)并不像我想象的那么简单。但你可以冒险一试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多