С этой проблемой сталкиваются многие из нас, программистов Swing: несколько элементов управления, изменяющих одни и те же данные, с последующим обновлением, отраженным в каждом элементе управления.В какой-то момент что-то должно иметь полное вето на то, какие обновления будут применены к модели: что бы это ни было, оно должно иметь возможность обрабатывать множественные (потенциально избыточные или даже противоречивые) обновления и решать, что с ними делать.Это может произойти на уровне модели, но в идеале это должен быть контроллер, который, в конце концов, скорее всего, там, где находится бизнес-логика.
Проблема с Swing в этом отношениичто часть контроллера MVC часто несколько разделяется между компонентом представления и моделью, поэтому может быть сложно централизовать эту логику.В некоторой степени интерфейс Action
исправляет это для событий actionPerformed (), помещая логику в одно место и позволяя ей делиться с другими компонентами, но это не помогает для других типов событий, или когда есть несколькоразличные классы событий, которые должны быть скоординированы.
В таком случае ответ заключается в том, чтобы следовать шаблону, на который намекает Swing, но который не сделан явным: выполнять запрошенное обновление, только если состояние действительно изменится, в противном случае -ничего такого.Примером этого является сам JList
: если вы попытаетесь установить выбранный индекс JList
на тот же индекс, который уже выбран , ничего не произойдет .События не будут запущены, обновления не произойдут: запрос на обновление фактически игнорируется.Это хорошая вещь.Это означает, что вы можете, например, иметь на вашем JList
слушателя, который будет реагировать на вновь выбранный элемент, а затем, в свою очередь, попросить того же JList
повторно выбрать этот же элемент, и вы не застрянете впатологически рекурсивная петля.Если все контроллеры моделей в приложении делают это, то не возникает проблем с несколькими повторяющимися событиями, которые запускаются повсюду - каждый компонент будет обновлять себя (и впоследствии запускать события) только в случае необходимости и при обновлении.тогда он может запустить все нужные ему события обновления, но только те компоненты, которые еще не получили сообщение, с этим поделают.