Java 使用OO观察者模式,而不更新引起更改的对象

Java 使用OO观察者模式,而不更新引起更改的对象,java,swing,oop,jtextfield,observer-pattern,Java,Swing,Oop,Jtextfield,Observer Pattern,我正在构建一个包含GUI和模型的应用程序。我正在使用观察者模式(使用java的内置接口)在模型中的字段发生更改时更新GUI 这通常工作正常,但我有一种情况,即模型中的特定字符串变量(特别是文件的url)可以由两个单独的JTextFields(swing)更改,其内容实际上反映了所讨论的模型变量的值 我遇到的问题来自这样一个事实:这些JTextField中的一个更改需要更新模型的状态以及另一个JTextField的内容。我的模型确保仅在模型状态发生更改时才向观察者发送通知。然而,修改JTextFi

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

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

我遇到的问题来自这样一个事实:这些JTextField中的一个更改需要更新模型的状态以及另一个JTextField的内容。我的模型确保仅在模型状态发生更改时才向观察者发送通知。然而,修改JTextFields的过程包括清空它的文本内容,然后重置它

在不深入太多细节的情况下,其结果是更新/通知过程陷入了infinte循环。我暂时搁置了这个特定问题的观察者模式来解决这个问题,但我想知道是否有人可以提出一种简洁的方法来确保某个特定组件不会被源于同一组件的更改“更新”

非常感谢您的帮助。

如中所述,这是其中之一。建议的方法依赖于
属性ChangeListener
,如图所示。
PropertyChangeEvent
包括旧值和新值供参考。

如中所述,这是其中的一个。建议的方法依赖于
属性ChangeListener
,如图所示。
PropertyChangeEvent
包括新旧值供参考。

这篇关于双向观察者的文章可能会在这方面提供一些帮助

在您的案例中,模型和视图似乎正在尝试相互更新。解决方案在于强制执行更新的方向。例如内层->模型->视图视图->模型->内层。所以这不是一个真正的观察者模式

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

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

这篇关于双向观察者的文章可能会在这方面提供一些帮助

在您的案例中,模型和视图似乎正在尝试相互更新。解决方案在于强制执行更新的方向。例如内层->模型->视图视图->模型->内层。所以这不是一个真正的观察者模式

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

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

修改JTextFields的过程包括清空它的文本内容,然后重置它。你为什么要把它空白?这听起来像是你问题的根源。无论如何,最简单的解决方案是比较文本字段内容和“未来”文本内容,忽略通知,因为这两个值是相等的。我完全同意mKorbel的观点-尝试设计一个演示问题的方法。它可能会帮助您自己解决问题,当然也会帮助我们帮助您。修改JTextFields的过程包括清空文本内容,然后重置文本内容。你为什么要把它空白?这听起来像是你问题的根源。无论如何,最简单的解决方案是比较文本字段内容和“未来”文本内容,忽略通知,因为这两个值是相等的。我完全同意mKorbel的观点-尝试设计一个演示问题的方法。这可能有助于您自己解决问题,也肯定会有助于我们帮助您。