Amélioration du graphique de fin de partie + Modification d'un commentaire dans Options
This commit is contained in:
@@ -93,7 +93,7 @@ public class Options {
|
||||
public static boolean AUTO_FOCUS = false;
|
||||
|
||||
/**
|
||||
* Nombre maximum de tuiles dans le jeu
|
||||
* Nombre maximum de tuiles dans le jeu (tuile initiale comprise)
|
||||
*/
|
||||
public static final int MAX_TILE_NUMBER = 51;
|
||||
|
||||
|
@@ -8,153 +8,141 @@ import javax.swing.*;
|
||||
/**
|
||||
* Un composant graphique Swing pour afficher un histogramme représentant les scores moyens des groupes.
|
||||
* Chaque barre représente un groupe et est colorée différemment en fonction de s'il est mis en surbrillance.
|
||||
*
|
||||
* Les barres sont ombrées et incluent des labels pour indiquer les scores moyens, ainsi que les noms des groupes.
|
||||
*
|
||||
* @version 1.0
|
||||
*
|
||||
* Les barres incluent des labels pour indiquer les scores moyens, ainsi que les noms des groupes.
|
||||
*
|
||||
* @version 1.2
|
||||
* @author Moncef STITI
|
||||
*/
|
||||
public class BarChartPanel extends JPanel {
|
||||
|
||||
/** Liste des scores moyens des groupes. */
|
||||
/**
|
||||
* Liste des scores moyens des groupes à afficher.
|
||||
*/
|
||||
private final List<Integer> groupAverages;
|
||||
|
||||
/** Indice du groupe mis en surbrillance. */
|
||||
private final int highlightedGroup;
|
||||
|
||||
/** Couleur de la barre pour le groupe du joueur. */
|
||||
private static final Color PLAYER_GROUP_COLOR = new Color(204, 0, 0);
|
||||
|
||||
/** Couleur des barres pour les autres groupes. */
|
||||
private static final Color OTHER_GROUP_COLOR = new Color(0, 0, 204);
|
||||
|
||||
/** Couleur de l'ombre projetée par les barres. */
|
||||
private static final Color SHADOW_COLOR = new Color(0, 0, 0, 60);
|
||||
|
||||
/** Couleur du texte affiché sur les barres. */
|
||||
private static final Color TEXT_COLOR = Color.BLACK;
|
||||
|
||||
/** Police pour le label "Score moyen". */
|
||||
private static final Font AVERAGE_FONT = new Font("Arial", Font.ITALIC, 12);
|
||||
|
||||
/** Police pour les labels des groupes. */
|
||||
private static final Font GROUP_LABEL_FONT = new Font("Arial", Font.BOLD, 16);
|
||||
|
||||
/** Police pour afficher les scores des groupes. */
|
||||
private static final Font SCORE_FONT = new Font("Arial", Font.BOLD, 14);
|
||||
|
||||
/** Marge autour de l'histogramme. */
|
||||
private static final int PADDING = 30;
|
||||
|
||||
/** Décalage de l'ombre en pixels. */
|
||||
private static final int SHADOW_OFFSET = 2;
|
||||
|
||||
/**
|
||||
* Construit un nouveau panneau d'histogramme.
|
||||
*
|
||||
* @param groupAverages Liste des scores moyens des groupes.
|
||||
* La taille de cette liste détermine le nombre de barres dans l'histogramme.
|
||||
* @param highlightedGroup Indice du groupe à mettre en surbrillance.
|
||||
* Si cet indice ne correspond à aucun groupe, aucune barre ne sera mise en surbrillance.
|
||||
* @throws NullPointerException si {@code groupAverages} est {@code null}.
|
||||
* Indice du groupe à mettre en surbrillance.
|
||||
*/
|
||||
private final int highlightedGroup;
|
||||
|
||||
/**
|
||||
* Couleur des barres pour le groupe du joueur.
|
||||
*/
|
||||
private static final Color PLAYER_GROUP_COLOR = new Color(11, 143, 55); // Vert
|
||||
|
||||
/**
|
||||
* Couleur des barres pour les autres groupes.
|
||||
*/
|
||||
private static final Color OTHER_GROUP_COLOR = new Color(11, 77, 143); // Bleu
|
||||
|
||||
/**
|
||||
* Couleur du texte.
|
||||
*/
|
||||
private static final Color TEXT_COLOR = Color.BLACK;
|
||||
|
||||
/**
|
||||
* Polices utilisée pour le texte de la moyenne du groupe
|
||||
*/
|
||||
private static final Font AVERAGE_FONT = new Font("Arial", Font.ITALIC, 12);
|
||||
|
||||
/**
|
||||
* Police utilisée pour les étiquettes de groupe
|
||||
*/
|
||||
private static final Font GROUP_LABEL_FONT = new Font("Arial", Font.BOLD, 16);
|
||||
|
||||
/**
|
||||
* Police utilisée pour les scores
|
||||
*/
|
||||
private static final Font SCORE_FONT = new Font("Arial", Font.BOLD, 14);
|
||||
|
||||
/**
|
||||
* Marge intérieure pour les barres.
|
||||
*/
|
||||
private static final int PADDING = 30;
|
||||
|
||||
/**
|
||||
* Crée un nouveau panneau d'histogramme avec les scores moyens des groupes et un groupe mis en surbrillance.
|
||||
* @param groupAverages Liste des scores moyens des groupes
|
||||
* @param highlightedGroup Indice du groupe à mettre en surbrillance
|
||||
*/
|
||||
public BarChartPanel(List<Integer> groupAverages, int highlightedGroup) {
|
||||
this.groupAverages = Objects.requireNonNull(groupAverages, "Group averages cannot be null");
|
||||
this.highlightedGroup = highlightedGroup;
|
||||
|
||||
// Configuration du panneau
|
||||
setOpaque(false);
|
||||
setBackground(new Color(0, 0, 0, 0));
|
||||
setAlignmentX(Component.CENTER_ALIGNMENT);
|
||||
}
|
||||
|
||||
/**
|
||||
* Dessine le composant graphique, incluant les barres, les labels et les scores.
|
||||
* Dessine les barres de l'histogramme avec les scores moyens des groupes.
|
||||
*
|
||||
* @param g Le contexte graphique.
|
||||
* @param g Contexte graphique pour dessiner les barres
|
||||
*/
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
|
||||
if (groupAverages.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
|
||||
Graphics2D g2d = (Graphics2D) g.create();
|
||||
if (groupAverages.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Graphics2D g2d = (Graphics2D) g.create();
|
||||
try {
|
||||
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
|
||||
int width = getWidth();
|
||||
int height = getHeight();
|
||||
int barWidth = width / (groupAverages.size() + 1);
|
||||
int maxScore = groupAverages.stream()
|
||||
.mapToInt(Integer::intValue)
|
||||
.max()
|
||||
.orElse(0);
|
||||
int barWidth = Math.max(20, width / (groupAverages.size() * 2));
|
||||
int maxScore = groupAverages.stream().mapToInt(Integer::intValue).max().orElse(1);
|
||||
|
||||
for (int i = 0; i < groupAverages.size(); i++) {
|
||||
int barHeight = calculateBarHeight(maxScore, height, groupAverages.get(i));
|
||||
int xPosition = (i + 1) * barWidth;
|
||||
int score = groupAverages.get(i);
|
||||
int barHeight = calculateBarHeight(maxScore, height, score);
|
||||
int xPosition = PADDING + i * (barWidth * 2);
|
||||
|
||||
Color barColor = (i == highlightedGroup) ? PLAYER_GROUP_COLOR : OTHER_GROUP_COLOR;
|
||||
|
||||
g2d.setColor(SHADOW_COLOR);
|
||||
g2d.fillRect(xPosition + SHADOW_OFFSET, height - barHeight - PADDING + SHADOW_OFFSET, barWidth - 5, barHeight);
|
||||
|
||||
// Dessiner la barre avec coins arrondis
|
||||
g2d.setColor(barColor);
|
||||
g2d.fillRect(xPosition, height - barHeight - PADDING, barWidth - 5, barHeight);
|
||||
g2d.fillRoundRect(xPosition, height - barHeight - PADDING, barWidth, barHeight, 10, 10);
|
||||
|
||||
// Ajustez dynamiquement la position des textes
|
||||
int textY = height - barHeight - PADDING - 20; // Score position
|
||||
if (textY < PADDING) {
|
||||
textY = PADDING - 2; // Éviter le chevauchement au sommet
|
||||
}
|
||||
|
||||
String avgScoreText = String.valueOf(groupAverages.get(i));
|
||||
// Ajouter le texte des scores
|
||||
g2d.setFont(SCORE_FONT);
|
||||
g2d.setColor(TEXT_COLOR);
|
||||
drawCenteredString(g2d, avgScoreText, xPosition, barWidth, textY);
|
||||
|
||||
// Position de "Score moyen"
|
||||
int labelY = textY - 15; // Placer légèrement au-dessus du score
|
||||
if (labelY < PADDING) {
|
||||
labelY = PADDING - 17; // Éviter les débordements
|
||||
}
|
||||
String scoreText = String.valueOf(score);
|
||||
drawCenteredString(g2d, scoreText, xPosition, barWidth, height - barHeight - PADDING - 5);
|
||||
|
||||
// Ajouter les labels "Score moyen"
|
||||
g2d.setFont(AVERAGE_FONT);
|
||||
drawCenteredString(g2d, "Score moyen : ", xPosition, barWidth, labelY);
|
||||
drawCenteredString(g2d, "Score moyen", xPosition, barWidth, height - barHeight - PADDING - 20);
|
||||
|
||||
// Ajouter les noms des groupes
|
||||
g2d.setFont(GROUP_LABEL_FONT);
|
||||
String groupLabel = "Groupe " + (i + 1);
|
||||
drawCenteredString(g2d, groupLabel, xPosition, barWidth, height - 10);
|
||||
drawCenteredString(g2d, "Groupe " + (i + 1), xPosition, barWidth, height - 5);
|
||||
}
|
||||
} finally {
|
||||
g2d.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Calcule la hauteur d'une barre proportionnellement au score maximum.
|
||||
*
|
||||
* @param maxScore Le score maximum parmi tous les groupes
|
||||
* @param height La hauteur totale du composant
|
||||
* @param score Le score du groupe courant
|
||||
* @return La hauteur de la barre
|
||||
* Calcule la hauteur de la barre en fonction du score et de la hauteur du panneau.
|
||||
* @param maxScore Score maximum
|
||||
* @param height Hauteur du panneau
|
||||
* @param score Score du groupe
|
||||
* @return Hauteur de la barre
|
||||
*/
|
||||
private int calculateBarHeight(int maxScore, int height, int score) {
|
||||
return (int) ((double) score / maxScore * (height - 2 * PADDING));
|
||||
}
|
||||
|
||||
/**
|
||||
* Dessine une chaîne centrée horizontalement dans une section de la largeur du composant.
|
||||
*
|
||||
* @param g2d Le contexte graphique
|
||||
* @param text Le texte à dessiner
|
||||
* @param xOffset La position x de départ de la section
|
||||
* @param sectionWidth La largeur de la section
|
||||
* @param y La position y où dessiner le texte
|
||||
* Dessine une chaîne de texte centrée horizontalement dans un rectangle.
|
||||
* @param g2d Contexte graphique pour dessiner le texte
|
||||
* @param text Texte à dessiner
|
||||
* @param xOffset Position X du coin supérieur gauche du rectangle
|
||||
* @param sectionWidth Largeur du rectangle
|
||||
* @param y Position Y du coin supérieur gauche du rectangle
|
||||
*/
|
||||
private void drawCenteredString(Graphics2D g2d, String text, int xOffset, int sectionWidth, int y) {
|
||||
FontMetrics metrics = g2d.getFontMetrics();
|
||||
@@ -165,13 +153,10 @@ protected void paintComponent(Graphics g) {
|
||||
|
||||
/**
|
||||
* Retourne la taille préférée du panneau.
|
||||
*
|
||||
* @return La taille préférée
|
||||
* @see Dimension
|
||||
* @return Taille préférée du panneau
|
||||
*/
|
||||
@Override
|
||||
public Dimension getPreferredSize() {
|
||||
// Définir une taille préférée par défaut si non spécifiée
|
||||
return new Dimension(400, 200);
|
||||
return new Dimension(600, 400);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user