Как приступить к реальной разработке GUI с помощью Java Swing и MVC - PullRequest
3 голосов
/ 23 февраля 2010

Я создаю эмулятор карточной игры в блэкджек. Я SCJP, знакомый с основными понятиями Java. У меня есть очень базовое понимание Java-свингов и AWT. Уже закончили писать основную игровую логику, логику CLI. Мой дизайн включает в себя несколько классов, как, Дилер, Игрок, Стол, Карта, Казино и некоторые другие. Перечисления для карт и сюиты.

Я читал о MVC как теоретической концепции, знакомой с названием «шаблоны проектирования» (вообще не понимая, как они реализованы). Везде, где мне предлагают учиться, при написании какого-то реального кода. Так что я начал с этого ...

Я застрял сейчас, как мне написать код для моего проекта? Написание кода GUI и организация его в рамках уже существующего кода.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2010

Мне потребовались целые годы, чтобы выучить MVC (меня учили неверным вещам об этом в университете, и, кроме того, многие онлайн-источники в то время были не правы по этому поводу). В любом случае, ядро, которое вам нужно сделать, это не иметь никакой информации о просмотре в вашей модели (то есть, как выглядит игрок на экране, буфер кадров, полигоны ваших моделей). Вместо этого вы создаете представление и модель в отдельных пространствах имен, а затем используете события, чтобы связать их вместе. Когда это иногда происходит в вашей модели, представление уведомляется, и в него вносятся изменения. Кроме того, когда нажимается мышь или клавиша, событие ввода преобразуется в другое ориентированное на модель событие, которое может принимать форму вызова метода в модель. Любые изменения в модели затем возвращаются в представление.

Запомните: модель должна быть работоспособной без присоединенного представления и не должна показывать ничего на экране во время выполнения (кроме, возможно, отладочной информации в консоли).

1 голос
/ 23 февраля 2010

Вот простой пример того, как это можно разделить.

Предположительно, карты игрока представлены в виде «руки» или подобного объекта (то есть набора карт). Это твоя модель. Итак, давайте назовем вашу модель:

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 кодирование пользовательского интерфейса - чистый код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...