Files
BUT3ProjetJeuGroupe/fr/iut_fbleau/Avalam/PieceButton.java

108 lines
2.9 KiB
Java
Raw Normal View History

package fr.iut_fbleau.Avalam;
import javax.swing.*;
import java.awt.*;
/**
* La classe <code>PieceButton</code>
*
* Représente graphiquement une tour Avalam sous forme dun 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 linteraction 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);
}
}