Files
racing-game/src/Dashboard.java

133 lines
3.9 KiB
Java

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