Один из вариантов может заключаться в принятии модели Swing-esque и в том, чтобы ваш посредник сохранял «очередь событий» обновлений, которые он должен сделать, когда придет время.Таким образом, когда вы добавляете новые окна во время обработки событий от какого-либо другого объекта, это окно не сбивает логику.Он просто добавляется в очередь «обрабатывать это, когда вы закончите», которая обрабатывается после завершения передачи.
Другой вариант - сделать копию списка перед его итерацией, чтобы изменениясделанные в необработанной структуре во время итерации, не отображаются в списке, который повторяется.
Еще одной идеей было бы использование некоторой неитераторской техники для посещения элементов.Например, если у вас есть окна, сохраненные в списке, вы можете использовать цикл for, подобный следующему:
for (int i = 0; i < elems.size(); ++i)
/* ... */
, который не будет генерировать подобные исключения.