2010-10-04 25 views
1

Je crée un jeu avec trois panneaux principaux et quelques sous-panneaux, et je ne comprends pas comment vous "connectez" les panneaux et leurs données.Java - Interface graphique, panneau et accès aux données

J'ai ma classe principale, qui étend JFrame et ajoute trois JPanels. Chacun de ces panneaux est une sous-classe de JPanel. (Ex: JPanel gameControlPanel = new GameControlPanel(), où GameControlPanel est une classe que j'ai créée pour étendre JPanel.)

Maintenant, toutes les données du jeu (telles que l'état du jeu, et deux arraylists qui contiennent des joueurs sauvegardés et des scores sauvegardés)) est dans le panneau de jeu. Mais j'ai besoin d'obtenir et de définir ces données à partir des deux autres panneaux. Et comment le faire m'évite.

** Alors ma question est: comment je fais ça? Comment puis-je accéder aux données d'une sous-classe JPanel d'une autre sous-classe JPanel (ayant le même parent JFrame)?


Si elle aide, c'est le code de la classe JFrame étendu, où ajouter les trois panneaux ...:

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);  

Le graphicsPanel tient toutes ces données:

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. 

Et je veux accéder à ces données depuis l'intérieur des deux autres panneaux (la classe gameDataPanel et la classe gameControlButton).

Répondre

0

Les données doivent être stockées dans un modèle partagé entre les parties de l'interface utilisateur, utiliser les panneaux de l'interface utilisateur uniquement pour la présentation. Utilisez le modèle d'observateur pour notifier la présentation de l'interface utilisateur à propos des modifications du modèle.

+0

Je ne comprends pas. Voir, j'ai toutes les données, et je veux le présenter dans les autres panneaux. Je ne sais pas comment l'obtenir pour que je puisse le présenter. –

+0

Pourriez-vous me donner un exemple de la façon dont vous feriez mon programme: quelle classe étendrait JFrame et JPanels, et comment seraient-ils connectés? –

+0

Veuillez lire cet article: http://java.sun.com/products/jfc/tsc/articles/architecture/ – spektom

3

Étudiez le modèle Model View Controller. Stockez l'état et les données du jeu dans le modèle et utilisez des observateurs ou des écouteurs pour informer les composants de l'interface utilisateur des modifications apportées aux données.

Par exemple, si vous suivez le chemin swing a été mis en œuvre, définir une interface d'écoute comme ceci:

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

Ensuite, au lieu des savedPlayers liste que vous pourriez avoir une classe Players semblable à ceci:

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); 
     } 

Lorsque vous créez un nouveau groupe qui a besoin d'observer les joueurs enregistrés, vous pouvez simplement passer l'instance de la classe des joueurs aux panneaux dans le constructeur:

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

Et à l'intérieur du constructeur il suffit d'enregistrer le panneau en tant qu'auditeur à players. De cette façon, chaque fois que sauve un joueur, quel que soit le composant/classe, toutes les parties intéressées seront averties des changements. Et assurez-vous de passer dans la même instance de Players à tous les panneaux.

Voici comment les composants Swing fonctionnent aussi, si vous regardez par exemple le JPanel, il a un certain nombre de méthodes addSomethingListener différentes. Les écouteurs sont des classes qui implémentent une interface d'écouteur spécifique. Et les modèles sont interchangeables dans de nombreux composants, par exemple JTable utilise TableModel, qui à son tour est également défini comme une interface. Cependant, dans votre cas, vous n'avez probablement pas besoin d'utiliser différentes implémentations de modèle.

0

Vous avez indiqué que vous souhaitiez afficher des informations dans plusieurs panneaux? Vous pouvez créer une classe globale pour stocker ces données de manière statique, puis accéder à ces informations à partir de vos autres classes à l'aide des méthodes get...(); et set...();.

Exemple:

public class Global 
{ 
    private static Object objectName; 

    public Object getObjectName() 
    { 
     return objectName; 
    } 

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

Laissez-moi savoir si je dois préciser davantage.