在“耦合”JSliders中避免不必要的事件和无限循环?

时间:2010-04-13 21:23:10

标签: java swing listener

我有一个GUI,它根据滑块值向Web服务器发出命令。其中一些滑块在Web服务器上“耦合”,因此更改其中一个滑块也可能会更改另一个滑块。耦合由Web服务器完成,返回根据发出的命令设置的值列表。

因此,我可以根据此响应轻松设置相应的滑块,但问题是这样做会导致触发ChangeListener,然后再次向Web服务器发出命令。理想情况下,“耦合”应该表现良好并避免无限循环,但这是一个潜在的问题,并且发送所有这些额外事件似乎是不必要的。

我能想到的两个解决方案是:

  1. 暂时删除侦听器,更改值,然后将其放回。
  2. 添加“手动”标志,让听众知道它应该忽略更改。
  3. 对我来说这些似乎都不是理想的解决方案,但其中一个比另一个“更好”?或者我有没有考虑第三种解决方案?

4 个答案:

答案 0 :(得分:3)

向侦听器添加enabled标志并在手动设置值

之前禁用它们

我不会添加和删除侦听器,因为它只会触发更多侦听器!

答案 1 :(得分:3)

一位作者称此问题为fibrillation。除了@Pyrolistical建议的标记方法之外,此discussion建议使用共享模型。

答案 2 :(得分:0)

.Net WPF中使用的标准模型是仅在属性值发生变化时触发事件!在您的情况下,它是setValue()方法。

答案 3 :(得分:0)

经过一段时间的努力,陷入各种布尔值的困扰,我发现解决方案是简单地为hasFocus添加一个检查并做出相应的响应。

  • 如果某个字段没有焦点,那么它将允许对其自身进行更新,但不会触发对其他任何字段的更新。

  • 如果一个字段DID具有焦点,那么它将触发对其他字段的更改。

这样,只有焦点字段可以触发任何更改,并且没有无限循环。现在,该代码易于阅读且简单,并且逻辑易于遵循和更新。