import java.awt.BorderLayout; import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; /** * Dashboard représente une vue graphique pour une voiture spécifique. * * Il affiche : * - le carburant restant * - le nombre de tours complétés * - l'état courant de la voiture * - un message (info utilisateur) * * Il fournit : * - un bouton Pause/Reprise du jeu * - un bouton Accelerer * - un bouton Rallentir */ public class Dashboard extends GameView { /** Label affichant carburant et nombre de tours */ private final JLabel infoLabel = new JLabel(); /** Label affichant l'état courant de la voiture */ private final JLabel stateLabel = new JLabel(); /** Label affichant les messages utilisateur */ private final JLabel messageLabel = new JLabel(); /** Bouton pause / reprise du jeu */ private final JButton pauseButton = new JButton(); /** Bouton pour accélérer la voiture */ private final JButton accelerateButton = new JButton("Accelerer"); /** Bouton pour ralentir la voiture */ private final JButton decelerateButton = new JButton("Rallentir"); /** Voiture associée à ce dashboard */ private final Car car; /** * Construit un dashboard pour une voiture donnée. * * @param game moteur du jeu * @param car voiture suivie par ce dashboard * @param title titre du dashboard * @param width largeur de la fenêtre * @param height hauteur de la fenêtre * @param x position horizontale de la fenêtre * @param y position verticale de la fenêtre */ public Dashboard(Game game, Car car, String title, int width, int height, int x, int y) { super(game, "Dashboard: " + title, width, height, x, y); this.car = car; // Fond de la fenêtre = couleur de la voiture frame.setBackground(car.getColor()); // ----- Partie centrale : infos ----- JPanel centerPanel = new JPanel(new GridLayout(3, 1)); centerPanel.add(infoLabel); centerPanel.add(stateLabel); centerPanel.add(messageLabel); //pour rendre le panel transparent centerPanel.setOpaque(false); // ----- Partie boutons ----- JPanel buttonPanel = new JPanel(new GridLayout(1, 3)); buttonPanel.add(decelerateButton); buttonPanel.add(pauseButton); buttonPanel.add(accelerateButton); setLayout(new BorderLayout()); add(centerPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); // listeners + texte initial initListeners(); updatePauseButtonText(); } /** Met à jour le texte du bouton Pause en fonction de l'état du jeu. */ private void updatePauseButtonText() { pauseButton.setText(game.getPause() ? "En Pause" : "En Cours"); } /** Initialise les listeners des 3 boutons. */ private void initListeners() { // Pause / reprise pauseButton.addActionListener(e -> { game.togglePause(); updatePauseButtonText(); game.notifyObservers(); }); // Accélérer accelerateButton.addActionListener(e -> { String msg = car.accelerate(); messageLabel.setText(msg); game.notifyObservers(); }); // Ralentir decelerateButton.addActionListener(e -> { String msg = car.decelerate(); messageLabel.setText(msg); game.notifyObservers(); }); } /** * Mise à jour de la vue. * Cette méthode est appelée par Game via notifyObservers(). */ @Override public boolean apply() { infoLabel.setText("Carburant : " + car.getFuel() + " | Tours : " + car.getRound()); stateLabel.setText("Etat : " + car.getState()); updatePauseButtonText(); return true; } }