As described in another question,我有一组Model对象和一组关联的Panel对象,它们使用户可以访问Model对象中的数据。面板被注册为模型的PropertyChangeListener,这样,如果其他原因更新了模型中的值,它将触发PropertyChangeEvent,并且面板会接收到该值,并知道从模型重新同步其值。 (目前,我只是天真地更新所有值,但是可以更智能地仅拉出更改后的属性。)

当某个模型被某个任意的未知源更新时,所有这些都变得很有意义,这确实发生在我的应用程序中。但是,大多数情况下,模型的属性是由面板本身设置的。在这种情况下,既然我已经将面板作为模型的PropertyChangeListener进行了连接,我的代码所做的事情就没有意义了:在面板更新模型之后,面板会从模型接收PropertyChangeEvent并从中获取相同的值首先发送给模型的模型。不需要进行任何更新,并且这样做没有设计意义。

因此,如何将某些东西注册为PropertyChangeListener,然后说“当我是PropertyChangeEvent的来源时,不要通知我”? (请注意,我无法通过调用PropertyChangeEvent.getSource()来回答这个问题;它会给我我的模型,而不是首先发送值的面板;这是无法查看的,也无法告诉您更改了属性的方法)

最佳答案

在所有现实中,您是否真的在乎是否让该事件向您退回?它允许您在面板外部更改模型时进行处理,而检查是否确实需要更新值确实没有很多开销。

PropertyChangeEvent包含要更改的属性以及旧值和新值。您可以检查每个传入的事件,以查看面板中的值是否与新值相同,然后将其丢弃。每当模型发生更改时,模型都应该告诉每个正在监听它的PropertyChangeEvent,否则它将需要对正在监听的对象有太多了解。

无论您做什么,都不要创建属性更改事件侦听器循环。如果您不十分小心的话,最终将很容易陷入无限循环。

07-26 03:07