【问题标题】:How do you make a class listen for PropertyChangeEvents caused by other classes, but not this class?你如何让一个类监听由其他类引起的 PropertyChangeEvents,而不是这个类?
【发布时间】:2009-01-13 20:30:54
【问题描述】:

As described in another question,我有一组模型对象和一组关联的面板对象,它们允许用户访问模型对象中的数据。面板被注册为模型的 PropertyChangeListener,这样如果有其他东西更新模型中的值,它就会触发 PropertyChangeEvent,面板接收它并知道从模型中重新同步它的值。 (目前我只是天真地更新所有值,但这可以更智能地只提取更改的属性。)

当模型被某个任意的未知来源更新时,所有这些都是有意义的,这确实发生在我的应用程序中。但是,大多数情况下,模型的属性是由面板本身设置的。在这种情况下,既然我已经将面板作为模型的 PropertyChangeListeners 连接起来,我的代码正在做一些没有意义的事情:在面板更新模型后,面板从模型接收一个 PropertyChangeEvent 并从中提取相同的值它最初发送给模型的模型。不需要进行更新,而且这样做没有设计意义。

那么我如何将某些东西注册为 PropertyChangeListener,然后说“当我是 PropertyChangeEvents 的来源时,不要通知我?” (请注意,我无法通过调用 PropertyChangeEvent.getSource() 来回答这个问题;它会给我我的模型,而不是首先发送值的面板;没有办法查看这个并判断是什么改变了属性.)

【问题讨论】:

    标签: java model-view-controller


    【解决方案1】:

    实际上,您是否真的在乎是否会遭到该事件的反击?它允许您处理任何时候在面板之外更改模型,并且在检查您是否真的需要更新值时确实没有太多开销。

    PropertyChangeEvent 保存正在更改的属性以及旧值和新值。您可以检查每个传入事件以查看 Panel 中的值是否与新值相同,如果是则丢弃该事件。每次模型发生变化时,模型都应该告诉正在监听它的每个人的 PropertyChangeEvents,否则它需要了解太多关于正在监听它的对象的信息。

    无论您做什么,请勿创建属性更改事件侦听器循环。如果您不小心,您最终会遇到很容易以无限循环结束的情况。

    【讨论】:

      【解决方案2】:

      我认为运行时不必要的重绘不会有任何可衡量的损害。所以从这个角度来看,没有必要更改代码。在这种情况下,您应该根据设计/架构来决定。你说:

      ...发生这种情况没有设计意义...

      ,但确实如此! 如果要避免重绘,则必须将源(面板)添加到更改模型的方法的参数中,将其放入更改事件中,并在再次评估事件时考虑该参数,这使您的代码更加复杂。想想你还需要做什么,如果同一个面板有两个实例,一个更改模型,一个在收到事件后必须更改...将 object-ids 添加到方法调用...如果以后更改模型的设计或查看编辑面板的一个字段导致面板另一部分中显示的模型更改的方式 - 再次进行其他更改......等等。

      此外,如果你按照描述的那样做,你将打破模型和视图的解耦,这绝不是一个好主意。

      如果您想保持简单,请保持原样。编写复杂代码的唯一原因是运行时结果不好,我认为你不会明白。

      【讨论】:

        猜你喜欢
        • 2012-11-09
        • 1970-01-01
        • 2020-11-23
        • 2021-01-26
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 2014-02-10
        • 1970-01-01
        相关资源
        最近更新 更多