package visual; import java.awt.BorderLayout; import java.awt.GraphicsEnvironment; import javax.swing.JComponent; import javax.swing.JFrame; import model.Game; /** * Classe abstraite représentant une vue graphique du jeu. * Chaque GameView est associée à une fenêtre JFrame et s'inscrit dans * la liste globale des vues pour permettre des mises à jour centralisées. */ public abstract class GameView extends JComponent implements Game.Observer { /** Fenêtre associée à cette vue */ protected final JFrame frame; protected final Game game; /** * Bloc statique exécuté au chargement de la classe pour vérifier * si le programme dispose d'un environnement graphique. */ static { if (GraphicsEnvironment.isHeadless()) { System.err.println("Aucun serveur d'affichage trouvé"); System.exit(1); } } /** * Construit une nouvelle GameView avec une fenêtre JFrame. * * @param title Titre de la fenêtre * @param width Largeur de la fenêtre * @param height Hauteur de la fenêtre * @param x Position horizontale de la fenêtre à l'écran * @param y Position verticale de la fenêtre à l'écran */ protected GameView(Game game, String title, int width, int height, int x, int y) { this.game = game; // la fenetre this.frame = new JFrame(title); // position fenetre frame.setLocation(x, y); // taille fenetre frame.setSize(width, height); // bool pour resize la fenetre frame.setResizable(true); // le bouton close par defaut frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // acceder a l'interieur de la fenetre frame.setContentPane(this); // visibilité de la fenetre frame.setVisible(true); // mettre un layout (la disposition des elements de la fenetre) frame.setLayout(new BorderLayout()); game.addObserver(this); } }