package fr.julien.solitaire; import java.awt.BasicStroke; import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.event.MouseListener; import java.awt.geom.Ellipse2D; import java.util.List; import javax.swing.JLabel; import fr.julien.solitaire.listeners.ListenerBoule; import fr.julien.solitaire.listeners.ListenerPremiereBoule; /** * Boule est la classe qui représente une boule sur le plateau du solitaire *

* Cette classe est caractérisée par les informations suivantes ; *

*

*

* Cette classe est une classe fille de JLabel pour laquelle la méthode paintComponent est * surchargée de manière à dessiner une boule. *

*

* De plus, cette classe possède des méthodes permettant de supprimer la boule de la case, * activer la case, etc. *

*

* Remarque : La classe Boule peut également être vue comme une classe Case car, le JLabel * est déssiné vide lorsque le paramètre plein est à false. *

* * @author Julien * @version 1.0 * */ public class Boule extends JLabel { /** * Identifiant pour la sérialisation */ private static final long serialVersionUID = -3228466367846096427L; /** * booléen qui permet de définir si la boule est sur la case ou non */ private boolean plein=true; /** * booléen qui permet de définir le la case est accessible pour une boule */ private boolean accessible=false; /** * booléen qui permet d'identifier la boule séléctionnée */ private boolean selected=false; /** * booléen qui permet de dessiner un rebord lors du passage du curseur */ private boolean focus; /** * La couleur de la boule */ private final Color couleur = Color.green; /** * Le listener qui permet d'enlever la première boule */ private MouseListener listenerDebut; /** * Le listener qui permet de jouer les autres coups. */ private MouseListener listener; /** * Constructeur de Boule * @param boules * Les autres boules du plateau (utilisé par les listenrers) */ public Boule(List> boules){ listenerDebut = new ListenerPremiereBoule(this, boules); listener = new ListenerBoule(this, boules); plein=true; addMouseListener(listenerDebut); } /** * La méthode contains est redéfinie pour que les mouseListeners ne soient * activés que lorsque le pointeur de la souris est dans le rond correspondant * à la boule et non dans le rectangle du JLabel */ @Override public boolean contains(int x, int y){ Ellipse2D el = new Ellipse2D.Double(0, 0, getWidth(), getHeight()); return el.contains(x, y); } /** * La méthode paintComponent est surchargée pour dessiner la boule */ @Override public void paintComponent(Graphics g){ int largeur=getWidth()-8; int hauteur=getHeight()-8; if(plein){ Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setColor(couleur); g2d.setStroke(new BasicStroke(3)); GradientPaint gradient = new GradientPaint(largeur / 2, 4, couleur, (largeur) / 2, 4 + hauteur, new Color(167,167,167,200)); g2d.setPaint(gradient); g2d.fillOval(4, 4, largeur, hauteur); gradient = new GradientPaint(largeur / 2, 4, Color.LIGHT_GRAY, largeur / 2, 4 + hauteur / 2, new Color(couleur.getRed(), couleur.getGreen(), couleur.getBlue(), 0)); g2d.setPaint(gradient); g2d.fillOval(4+largeur/5, 4, 5*largeur/8, hauteur/3); if(selected){ g2d.setColor(Color.cyan); g2d.drawOval(4, 4, largeur, hauteur); } else if(focus){ g2d.setColor(Color.white); g2d.drawOval(4, 4, largeur, hauteur); } } else { Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.DARK_GRAY); g.fillOval(4, 4, largeur, hauteur); g2d.setColor(Color.LIGHT_GRAY); if(accessible){ g.setColor(Color.cyan); } g2d.setStroke(new BasicStroke(2)); g.drawOval(4, 4, largeur, hauteur); } } /** * Cette méthode permet de permuter les listeners * une fois le premier tour effectué */ public void effectuerPremierTour(){ removeMouseListener(listenerDebut); addMouseListener(listener); } /** * Méthode qui permet de modifier l'état d'une case * @param plein * booléen vrai si la case contient une boule */ public void setPlein(boolean plein) { this.plein = plein; repaint(); } /** * Méthode d'accès à l'état de la case * @return true si la case contient une boule */ public boolean isPlein() { return plein; } /** * Méthode qui permet de savoir si la case est accessible * @return true si la case est accessible */ public boolean isAccessible() { return accessible; } /** * Méthode qui permet de rendre une case accessible ou non * @param accessible * l'accessiblilité de la case */ public void setAccessible(boolean accessible) { this.accessible = accessible; repaint(); } /** * Méthode qui permet de séléctionner une case * @param selected * le booléen qui permet de définir si la case est séléctionnée */ public void setSelected(boolean selected) { this.selected = selected; repaint(); } /** * Méthode qui permet de modifier le focus sur une case * @param focus * Le focus à modifier */ public void setFocus(boolean focus) { this.focus = focus; repaint(); } }