2010-04-13 25 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()方法。