Как приступить к реальной разработке GUI с помощью Java Swing и MVC
Я создаю эмулятор карточной игры в блэкджек. Я SCJP, знакомый с основными понятиями Java. У меня есть очень базовое понимание Java-свингов и AWT. Уже закончили писать основную игровую логику, логику CLI. Мой дизайн включает в себя несколько классов, таких как, Дилер, Игрок, Стол, Карта, Казино и некоторые другие. Перечисления для карт и комплектов.
Я читал о MVC как о теоретической концепции, знакомой с названием "шаблоны проектирования" (не понимая, как они реализованы). Везде, где мне предлагают учиться во время написания реального кода. Так что я начал с этого...
Я застрял сейчас, как я должен писать код для моего проекта? Написание кода GUI и организация его в рамках уже существующего кода.
2 ответа
Мне потребовались годы, чтобы выучить MVC (меня учили неверным вещам об этом в университете, и, кроме того, многие онлайн-источники в то время были неправы). В любом случае, ядро, которое вам нужно сделать, это не иметь никакой информации о просмотре в вашей модели (то есть, как выглядит игрок на экране, кадровый буфер, полигоны ваших моделей). Вместо этого вы создаете представление и модель в отдельных пространствах имен, а затем используете события, чтобы связать их вместе. Когда это иногда происходит в вашей модели, представление уведомляется, и в него вносятся изменения. Кроме того, когда нажимается мышь или клавиша, событие ввода преобразуется в другое ориентированное на модель событие, которое может принимать форму вызова метода в модель. Любые изменения в модели затем возвращаются в представление.
Помните это: модель должна быть функциональной без присоединенного представления и не должна показывать ничего на экране во время выполнения (кроме, возможно, отладочной информации в консоли).
Вот простой пример того, как это можно разделить.
Предположительно, карты игрока представлены в виде "руки" или подобного объекта (то есть набора карт). Это твоя модель. Итак, давайте назовем вашу модель:
package casino.blackjack.model;
class DealtCards
{..}
Вы отображаете свои карты, используя, возможно, JPanel или какую-либо другую конструкцию Swing. Таким образом, вы можете поместить все объекты, которые на самом деле выполняют рендеринг каждой карты, в отдельный пакет:
package casino.blackjack.view;
class DealtCardsView
{..}
Объект DealtCards существует независимо от того, как он отображается, но его состояние может измениться, если пользователь что-то сделает в графическом интерфейсе. Например, просить, чтобы его "ударили". Предположительно, для этого может быть кнопка. Представление получено из вашей модели.
package casino.blackjack.view;
class DealtCardsView
{
JButton hitMeButton = new JButton("HIT");
DealtCards cards;
public DealtCardsView(DealCards myCards)
{
cards = myCards;
renderCards();
}
private void renderCards(){.. do something..}
}
Теперь, если игрок решает ударить, его объект DealtCards изменяется. Итак, мы хотим реализовать способ обновления вашей модели. Вы можете сделать это с помощью класса контроллера. Класс контроллера реализует интерфейс ActionListener. Когда действие выполняется (т.е. пользователь нажимает кнопку "нажать"), контроллер обновляет модель. Таким образом, представление не может напрямую обновить модель. Он просто отправляет уведомление о том, что "действие" произошло. Любые заинтересованные стороны, в нашем случае наш контролер, могут принять соответствующие меры.
package casino.blackjack.controller;
class DealtCardsController implements ActionListener
{
DealtCards cards;
DealtCardsView cardView;
public DealtCardsController(DealtCards myHand, DealtCardsView myView)
{
cards = myHand;
cardView = myView;
cardView.hitMeButton.addActionListener(this);
}
public void actionPerformed(ActionEvent e)
{
cards.changed();
}
}
Таким образом, вы разбили свое приложение на три слоя. Ваша модель просто содержит текущее состояние (или текущие данные) и любую проверку, которая обходит его. Ваши классы представления отображают модель соответствующим образом. Любое взаимодействие с пользователем в представлении обрабатывается контроллером, в обязанности которого входит обновление модели.
Таким образом, если вы хотите изменить свой вид (например, использовать апплет вместо окна), вашей модели все равно.
Извините за длинный затянувшийся ответ, но надеюсь, что это немного поможет!
РЕДАКТИРОВАТЬ: хорошее объяснение MVC здесь: кодирование пользовательского интерфейса java / gwt - чистый код