2012-01-08 5 views
0

私のアプリケーションでは、ViewにはModelの変更があります。 Controllerは、ViewModelをディスパッチするイベントの処理を担当します。Java MVC:Observerパターンを使用してビューを更新しています

たとえば、2つのビューがあるとします。まず、InputViewは、2つのJSpinner要素(Spinner1Spinner2)を含んでいます。次に、ResultViewには、JLabelのスピナーの値が含まれています。また、追加の制約として、Spinner2の値をSpinner1の値に依存させたいと考えています。 Spinner2の最小値は2x、現在の値はSpinner1である必要があります。

Spinner1の値をControllerに変更すると、ChangeEventとなり、Modelが更新されます。 Spinner2の値を調整する必要があるため、別のChangeEventが送信され、Modelが2回更新されます。このスキーマの問題点は、それぞれModelが更新され、Viewのリフレッシュが更新されることです。したがって、この例ではViewは1つではなく3または4回更新されます(Spinner1変更、Spinner2最小値の変更、Spinner2値の変更)。これによりちらつきが発生します。

すべての変更が完了したらViewが一度だけ更新されるようにするにはどうすればよいですか?

+0

私がちらつきについての考えを持っていないので、私は、ビューの必然的なリフレッシュを意味ちらつくことで、あなたのコード – mKorbel

+0

内の別のrecrusive問題がなければならない、SSCCEを投稿してください。私たちは、チャートまたはちょうどラベルよりも複雑なもののいくつかの並べ替えを使用している場合は、複数のリフレッシュが 'Model'を観察label' noticible –

答えて

2

gang-of-four bookは言う:

「対象の更新をトリガし、その観察者が一貫滞在する通知メカニズムに依存しているが、実際にどのようなオブジェクトの呼び出しはここでは、2つのオプションがあり、更新をトリガする通知は誰?。

は?
Have state-setting operations on Subject call Notify after they change the 
subject's state. The advantage of this approach is that clients don't have 
to remember to call Notify on the subject. The disadvantage is that several 
consecutive operations will cause several consecutive updates, which may be 
inefficient. 

Make clients responsible for calling Notify at the right time. The advantage 
here is that the client can wait to trigger the update until after a series 
of state changes has been made, thereby avoiding needless intermediate updates. 
The disadvantage is that clients have an added responsibility to trigger the 
update. That makes errors more likely, since clients might forget to call Notify. 

2番目のオプションは、あなたに有用であり得る。

1

だから、これはどのように行われるかを観察している:

label -> spinner 2 -> spinner 1 

私があなただったら、私は設定します 『』変更の種類を。私のコントローラーでは、私の観察者に通知する方法を制御することができました。

あなたのコードを投稿するともっと役に立ちます。

+0

いいえ、'になります。スピナーを備えたパネルも「モデル」を観察します。それぞれのスピナーは 'Model'を変更する' Controller'に '状態変更 'をディスパッチします。この時点で、 'InputView'は従属' spinner 2 'の値を更新します。これは 'Model'更新の第2波をトリガします –

関連する問題