108 lines
2.9 KiB
Java
108 lines
2.9 KiB
Java
package fr.iut_fbleau.Avalam;
|
||
import javax.swing.*;
|
||
import java.awt.*;
|
||
|
||
/**
|
||
* La classe <code>PieceButton</code>
|
||
*
|
||
* 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);
|
||
}
|
||
}
|