2010-04-13 26 views
4

我有一个基于滑块值向Web服务器发出命令的GUI。其中一些滑块在Web服务器上“耦合”,因此更改其中一个滑块也可能会改变另一个滑块。该耦合是通过Web服务器返回基于发出的命令设置的值列表完成的。避免“耦合”JSliders中的不必要事件和无限循环?

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

这两种方案我能想到的是:

  1. 暂时删除听众,改变的值,然后将其放回。
  2. 添加一个“手动”标志,让听众知道它应该忽略更改。

这些对我来说都不是理想的解决方案,但是其中一个比另一个“更好”?还是有没有第三个解决方案,我不考虑?

回答

3

添加enabled标志的听众和手动之前禁用它们的值设置

我不会添加和删除监听器的,只是触发更多的听众!

+0

在这个解决方案中出现意外行为的可能性(来自设置/取消设置标志的问题)仍然关系到我一点,但它似乎是最好的解决方案。 – 2010-04-14 15:48:29

3

一位作者称这个问题为fibrillation。这个discussion建议共享模型,除了由@Pyrolistical建议的标志方法。

+0

在这种情况下,共享模型的难点在于“耦合”仅存在于服务器上,而我的GUI并不知道,因此实现共享模型并不重要,因为它基本上是整个GUI的模型。 – 2010-04-13 23:48:03

+0

我明白了。是否有可能使用'setValueIsAdjusting()'来控制模型中的变更事件流? – trashgod 2010-04-14 01:58:03

+0

对'setValueIsAdjusting()进行过滤确实有助于减少事件的数量,但不幸的是,它不会消除后续事件生成时的问题。 – 2010-04-14 15:45:05

0

.Net WPF中使用的标准模型是仅当属性的值已更改时才触发事件!在你的情况下,它是setValue()方法。