package fr.iut_fbleau.Avalam; import javax.swing.*; import java.awt.*; /** * La classe PieceButton * * Représente graphiquement une tour Avalam sous forme d’un bouton rond. * Chaque bouton : * - possède une couleur correspondant au joueur, * - affiche la hauteur de la tour, * - réagit au survol de la souris. * * Ce composant permet l’interaction avec les pièces du plateau. */ public class PieceButton extends JButton { //Attributs /** Couleur graphique du pion. */ private java.awt.Color color; /** Hauteur de la tour affichée. */ private int height; /** Indique si la souris survole le bouton. */ private boolean hover = false; /** Position de la tour sur la grille (ligne). */ public final int row; /** Position de la tour sur la grille (colonne). */ public final int col; //Constructeur /** * Construit un bouton représentant une tour Avalam. * * @param c couleur graphique du pion * @param height hauteur de la tour * @param row ligne du pion * @param col colonne du pion */ public PieceButton(java.awt.Color c, int height, int row, int col) { this.color = c; this.height = height; this.row = row; this.col = col; setBorderPainted(false); setContentAreaFilled(false); setFocusPainted(false); setOpaque(false); addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseEntered(java.awt.event.MouseEvent e) { hover = true; repaint(); } @Override public void mouseExited (java.awt.event.MouseEvent e) { hover = false; repaint(); } }); } //Méthodes /** * Dessine le pion rond ainsi que sa hauteur au centre. * * @param g contexte graphique */ @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // Couleur foncée lorsque survolé g2.setColor(hover ? color.darker() : color); g2.fillOval(0, 0, getWidth(), getHeight()); // Hauteur affichée au centre g2.setColor(java.awt.Color.BLACK); g2.setFont(new Font("Arial", Font.BOLD, 18)); String txt = String.valueOf(height); FontMetrics fm = g2.getFontMetrics(); int x = (getWidth() - fm.stringWidth(txt)) / 2; int y = (getHeight() + fm.getAscent()) / 2 - 3; g2.drawString(txt, x, y); g2.dispose(); } //Affichage /** * Rend le bouton réellement rond (zone cliquable circulaire). * * @param x coordonnée X * @param y coordonnée Y * @return true si le point est dans le cercle */ @Override public boolean contains(int x, int y) { double dx = x - getWidth()/2.0; double dy = y - getHeight()/2.0; return dx*dx + dy*dy <= (getWidth()/2.0)*(getWidth()/2.0); } }