2010-10-04 3 views
1

Я делаю игру с тремя основными панелями и несколькими субпанелями, и я смущен тем, как вы «соединяете» панели и их данные.Java-GUI, панель и доступ к данным

У меня есть мой основной класс, который расширяет JFrame и добавляет три JPanels. Каждая из этих панелей является подклассом JPanel. (Пример: JPanel gameControlPanel = новый GameControlPanel(), где GameControlPanel - это класс, который я создал для расширения JPanel.)

Теперь все данные игры (например, состояние игры и два аррайалиста, в которых хранятся сохраненные игроки и сохраненные баллы) находится в игровой панели. Но мне нужно получить и установить эти данные из двух других панелей. И как это сделать, уклоняется от меня.

** Так что мой вопрос: как мне это сделать? Как я могу получить доступ к данным в одном подклассе JPanel из другого подкласса JPanel (который имеет один и тот же родительский JFrame)?


Если это помогает, это код расширенного класса JFrame, в котором я добавляю три панели ...:

JPanel controlButtonsPanel = new GameControlButtons(); 
    controlButtonsPanel.setPreferredSize(new Dimension(801,60)); 
    controlButtonsPanel.setBorder(new LineBorder(Color.white, 1)); 
    constraints.anchor = GridBagConstraints.NORTHWEST; 
    constraints.weightx = 2; 
    constraints.weighty = 0.3; 
    this.add(controlButtonsPanel, constraints); 

    JPanel gameDataPanel = new GameDataPanel(); 
    gameDataPanel.setPreferredSize(new Dimension(500,838)); 
    gameDataPanel.setBorder(new LineBorder(Color.white, 2)); 
    constraints.anchor = GridBagConstraints.NORTHEAST; 
    constraints.weightx = 1; 
    constraints.weighty = 2; 
    this.add(gameDataPanel, constraints); 

    JPanel graphicsPanel = new RoofRunnerGame("Ken"); 
    constraints.anchor = GridBagConstraints.SOUTHWEST; 
    constraints.weightx = 2; 
    constraints.weighty = 1; 
    graphicsPanel.setBorder(new LineBorder(Color.white, 1)); 
    graphicsPanel.setPreferredSize(new Dimension(800,800)); 
    graphicsPanel.requestFocus(); 
    this.add(graphicsPanel, constraints);  

graphicsPanel держит все эти данные:

private ArrayList<Player> savedPlayers;          // Holds saved data for player's who paused and exited game. 
private ArrayList<Player> savedScores;          // Holds high scores from player's who played game and died. 
private ArrayList<Birds> birdList = new ArrayList<Birds>();     // Not serialized due to its randomness and unimportance to player. 
private ArrayList<Clouds> cloudList = new ArrayList<Clouds>();    // Not serialized due to its randomness and unimportance to player. 
private Player gamePlayer;             // Player object that holds all data for a game instance. 

И я хочу получить доступ к этим данным из двух других панелей (класс gameDataPanel и класс gameControlButton).

ответ

0

Данные должны храниться в модели, совместно используемой частями пользовательского интерфейса, использовать панели пользовательского интерфейса только для презентации. Используйте шаблон наблюдателя, чтобы уведомить презентацию пользовательского интерфейса об изменениях в модели.

+0

Я не понимаю. Смотрите, у меня есть все данные и вы хотите представить их на других панелях. Я просто не знаю, как это сделать, чтобы я мог это представить. –

+0

Не могли бы вы привести пример того, как вы будете делать мою программу: какой класс расширит JFrame и JPanels и как они будут связаны? –

+0

Прочтите эту статью: http://java.sun.com/products/jfc/tsc/articles/architecture/ – spektom

3

Изучите рисунок Model View Controller. Храните состояние игры и данные в модели и используйте Наблюдатели или слушатели, чтобы уведомить компоненты пользовательского интерфейса об изменениях в данных.

Например, если вы будете следовать пути Свинг был реализован, определить интерфейс слушателя, как это:

public interface PlayersListener { 
    void playerSaved(Player player); 
} 

Затем, вместо того, чтобы перечислить savedPlayers вы могли бы иметь класс Players похожее на это:

public class Players { 
    private List<PlayersListener> listeners = ...; 
    private List<Player> players = ...; 

    public void addPlayersListener(PlayersListener listener) { 
     if (!listeners.contains(listener)) { 
      listeners.add(listener); 
     } 
    } 

    public voi removePlayerListener(PlayerListener listener) { 
     listeners.remove(listener); 
    } 

    public voi savePlayer(Player player) { 
     players.add(player); 
     for (PlayerListener listener : listeners) { 
      listener.playerSaved(player); 
     } 

при создании новой панели, которую необходимо соблюдать сохраненные игрок, вы можете просто передать экземпляр класса игроков на панель в конструкторе:

controlButtonsPanel = new GameControlButtons(players); 
.. 
gameDataPanel = new GameDataPanel(players); 

И внутри конструктора просто зарегистрируйте панель в качестве слушателя до players.

Этот способ, когда что-то сохраняет игрока, независимо от того, какой компонент/класс он есть, все заинтересованные стороны получат уведомление об изменениях. И не забудьте пройти в том же экземпляре Players для всех панелей.

На самом деле, как работают компоненты Swing, если вы посмотрите на JPanel, у него есть несколько различных методов addSomethingListener. Слушатели - это классы, которые реализуют конкретный интерфейс слушателя. И модели меняются во многих компонентах, например JTable использует TableModel, который, в свою очередь, также определяется как интерфейс. Однако в вашем случае вам, вероятно, не нужно будет использовать разные реализации моделей.

0

Вы сказали, что хотите отобразить некоторую информацию в более чем одной панели? Вы можете сделать глобальный класс для хранения этих данных статически, а затем получить доступ к этой информации из других классов, используя методы get...(); и set...();.

Пример:

public class Global 
{ 
    private static Object objectName; 

    public Object getObjectName() 
    { 
     return objectName; 
    } 

    public void setObjectName(Object objectName) 
    { 
     this.objectName = objectName; 
    } 
} 

Позвольте мне знать, если мне нужно доработать.

Смежные вопросы