Проблема архитектуры Java Swing? - PullRequest
0 голосов
/ 25 января 2010

До сих пор я разрабатывал простые приложения Swing, поэтому не было необходимости разбивать код GUI на diff. классы, но поскольку это приложение будет очень большим, я решил разбить код на diff. классы, чтобы сделать код более управляемым.

Но перед тем, как продолжить, у меня возникают некоторые сомнения в следующем:

Краткое описание GUI

У него будет основной JFrame (MainFrame). При этом устанавливается JPanel (MainJPanel), макет которого должен быть CardLayout. Он будет содержать 25 карт (каждая карта имеет форму JPanel, которая содержит свои собственные компоненты свинга).

Q1. Я решил сделать 25 классов (каждый для одной карты JPanel). Это правильный подход?

Q2. Если приведенный выше ответ верен, то как мне написать код методов кнопок xxxxActionPerformed (), которые находятся на этих картах (25 карт), поскольку эти методы требуют доступа к объекту MainJPanel

, например

public void buttonActionPerformed(ActionEvent evt) {
    java.awt.CardLayout c = (java.awt.CardLayout) mainJPanel.getLayout();
    c.show(mainJPanel, "card1");  // card1 is this card
    mainJPanel.updateUI();
}

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

Ответы [ 2 ]

10 голосов
/ 25 января 2010

Q1) Звучит довольно много уроков. Хотя возможно, что каждый класс обладает определенной функциональностью, я нахожу более вероятным, что вы можете объединить некоторые из них в более общие классы. Например, вместо YellowCard и BlueCard у вас может быть просто ColorCard, где цвет является параметром.

Q2) Model View Presenter (MVP) и Model View Controller (MVC) - это два (или один, в зависимости от вашего представления) общих шаблона проектирования, которые помогают создавать графические интерфейсы, чтобы у каждого были необходимые данные.

Более конкретно, вам может не понадобиться, чтобы все карты имели ссылку на родительскую панель. Например, если у вас есть BurgerPanel, которая позволяет пользователю заказывать гамбургеры, и StatusPanel, которая показывает, сколько гамбургеров было заказано, вы можете общаться между ними следующим образом ...

Создайте объект StoreStatus и передайте его как BurgerPanel, так и StatusPanel. Когда пользователь заказывает бургер с панелью бургера, он обновляет статус магазина. Статус магазина уведомляет StatusPanel об этом обновлении через шаблон наблюдателя, и затем StatusPanel отражает изменение.

ОБНОВЛЕНИЕ: Что касается вашего конкретного примера, вы бы либо ссылались на родительский класс, либо уведомляли его об обновлениях с помощью шаблонов наблюдателя. (Преимущество шаблона наблюдателя состоит в том, что любые изменения в родительском классе не могут создавать изменения в дочерних классах.)

1 голос
/ 25 января 2010

Я бы сказал, что вы правы в создании класса для каждой карты. Это логичный способ разделить код.

Если вам нужно сослаться на MainJPanel, просто передайте ее в конструктор каждого класса карт и сохраните ссылку на него.

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