Хорошо, значит, вы столкнулись с рядом проблем.
Первый
Swing уже MVC
Второй
Форма "MVC", которая преподается и обсуждается сегодня, на самом деле не соответствует тому, как предполагалось использовать первоначальное намерение MVC. Считалось, что это скорее руководство или рекомендация, а не просто правило или парадигма.
Проблема в том, что в итоге вы получаете «чистых», которые настаивают на абсолютном разделении всех моделей, контроллеров и представлений в некоторых случаев, в ущерб API или решению (это когда вы сталкиваетесь с проблемами "контроллера массивного представления").
Почему? Рассмотрим кнопку. Это представление, оно имеет модель и может выступать в качестве контроллера.
Вам не нужен отдельный «контроллер» для управления кнопкой. Он может регистрировать действия клавиатуры и мыши, необходимые для мониторинга с базовой системой. Он может координировать изменения между моделью и самим собой (представлением) и становится автономной единицей работы.
Серьезно, не могли бы вы себе представить необходимость создания отдельного контроллера каждый раз, когда вы создаете кнопку или любой другой пользовательский интерфейс компонент ... ??
Когда вы добавляете кнопку в другой контейнер (представление), кнопка действует как ее собственный вид / контроллер. В этом случае родительский контейнер может иметь более крупную модель и несколько подвидов, которыми он «управляет» или координирует.
Контейнер также может управляться через внешний контроллер, который действует для координации изменений между контейнером. и большая модель, позволяющая отделить ее, но в этом случае я бы спроектировал ее так, чтобы логика реализации c была отделена, чтобы внешний контроллер не заботился о том, «как» все сделано Просто существовал договор, позволяющий передавать информацию между этими слоями.
Итак, какой смысл?
Не зацикливайтесь на попытках произвести " clean "MVC, особенно в Swing, вы будете разрывать слух.
Также помните, что вы можете поговорить с контроллером с другим контроллером, это позволяет ему распространять информацию там, где не работают субконтроллеры не нужна или не нужна вся информация, которая может быть доступна родительскому контроллеру. Это также позволяет ему управлять совершенно разными контроллерами, обеспечивая большую развязку элементов и хороший подход «включай и работай».
Итак, как это вам поможет?
Это должно предоставить вам некоторые места, с которых можно спрыгнуть.
Если вы не хотите, чтобы GameEngine
говорил напрямую с представлением, вы можете установить sh контроллер "рендеринга". Кто будет нести ответственность за координацию изменений, внесенных игровым движком, в модель с базовым видом (ie, расписание прохода рендеринга).
Это позволит GameEngine
"управлять" одним или несколькими «рендеринг» контроллеров и позволяет отделить фактический рендеринг от GameEngine
. Вы можете сделать это, потому что контроллер может отвечать за другие контроллеры - это просто координатор между моделью и следующий слой (обычно вид)
В этом примере вы можете изменить систему рендеринга, просто изменив реализацию контроллера «рендеринга» (и если вы используете interface
s, это становится намного проще) без влияния на GameEngie
, что, в конце концов, является преимуществом следования этому типу конструкции - разделению ответственности посредством разъединения.
Передача мыслей ...
- Никогда не звоните
paintComponent
напрямую. Есть причина, по которой это protected
- Не используйте
getGraphics
. Это не так, как обычная живопись в Swing. getGraphics
в лучшем случае является просто снимком последнего прохода краски, выполненного Swing. Помните, что в Swing вы не управляете процессом рисования, об этом позаботились сами, вместо этого вы запланировали проход краски (ie repaint
) и позволили системе позаботиться о сбросе - Если вы хотите / хотите контролировать процесс рисования, вам нужно использовать
java.awt.Canvas
и BufferStrategy
.