Я бы следовал тому, что Spring MVC делает для веб-клиентов:
Внедряет слушателей в клиент Swing, как инъекция Spring-зависимостей.Пусть разработчик пользовательского интерфейса просто вызывает экземпляры слушателя, не зная, что они делают.
Это позволит вам сохранить всю логику обработки событий в классе, который находится за пределами классов представления Swing.
У вас должен быть способ обновить модель внутри слушателей и сделать ее доступной для экземпляров Swing.
Контроль версий не ваше спасение;интерфейсы есть.Создайте интерфейсы, чтобы изолировать код представления от остальных.Вы можете быть независимыми, пока интерфейсы не меняются.
Под интерфейсом я имею в виду интерфейс Java:
public interface Foo {
void doSomething(ModelObject m);
}