Java MVC: обновление представления с использованием шаблона Observer - PullRequest
0 голосов
/ 08 января 2012

В моем приложении View наблюдает Model изменения.Controller отвечает за обработку событий, отправляемых View и обновление Model.

. Для примера, предположим, у меня есть два представления.Во-первых, InputView, содержит два элемента JSpinner (Spinner1 и Spinner2).Во-вторых, ResultView, содержит JLabel со значениями из счетчиков.И как дополнительное ограничение, мы хотим, чтобы значения Spinner2 зависели от значений Spinner1.Допустим, минимальное значение в Spinner2 должно быть 2x, текущее значение Spinner1.

При изменении значения Spinner1 Controller получает ChangeEvent и обновляет Model.Так как мы также должны отрегулировать значение Spinner2, будет отправлено другое ChangeEvent, а Model будет обновлено во второй раз.Проблема этой схемы в том, что с каждым Model обновлением наблюдаемое View обновляется.Таким образом, в этом примере View будет обновляться 3 или 4 раза вместо одного (Spinner1 изменение, Spinner2 изменение минимального значения, Spinner2 изменение значения).Это вызывает мерцание.

Как убедиться, что View обновляется только один раз, когда все изменения сделаны?

Ответы [ 3 ]

2 голосов
/ 08 января 2012

книга gang-of-four говорит:

"Кто запускает обновление? Субъект и его наблюдатели полагаются на механизм уведомления, чтобы оставаться последовательным. Но какой объект на самом деле вызывает NotifyЧтобы запустить обновление? Вот два варианта:

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.

второй вариант может быть вам полезен.

1 голос
/ 08 января 2012

Итак, как делается наблюдение:

label -> spinner 2 -> spinner 1

На вашем месте я бы установил "типы изменений". Так что в моем контроллере я мог контролировать, как уведомлять моих наблюдателей.

Я могу быть более полезным, если вы отправите свой код.

1 голос
/ 08 января 2012

Статья Разработка приложений Java SE с MVC: проблемы с разработкой приложений ставит проблему в контекст и предлагает использовать изменение свойства "для проверки входящего измененного значения модели потекущее значение хранится в компоненте Swing. "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...