1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
package view;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import definition.Parameters;
/*
* Cette classe permet d'utiliser une grille d'hexagone
* C'est très très lent puisque chaque segment est redessiné 2 fois !
*/
public class HexagonalGridWindow extends JDialog {
/**
* @param args
*/
JSpinner X;
JSpinner Y;
public HexagonalGridWindow(JSpinner queenXPosSpinner,JSpinner queenYPosSpinner) {
JPanel jp=(JPanel) this.getContentPane(); // Récupère le conteneur de la fenêtre
final AffGrille jp2=new AffGrille(); // Crée une instance de la classe privée AffGrille
X=queenXPosSpinner;
Y=queenYPosSpinner;
jp2.addMouseMotionListener(new MouseMotionListener(){
Polygon p;
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent arg0) {
p=jp2.pol;
if(!p.contains(arg0.getPoint())){
jp2.repaint();
}
}
});// Repeind jp2 lorsque la souris se déplace
jp2.addMouseListener(new MouseAdapter(){
@Override
public void mouseClicked(MouseEvent arg0) {
super.mouseClicked(arg0);
JOptionPane.showMessageDialog(null,"Hexagone n°:"+jp2.numero);
ModifyQueenPosition(new Point((int)jp2.numero/30,jp2.numero%30));
}
});// Evenement qui survient au clicque
jp.add(jp2);// Ajoute le composant à la fenêtre
this.setSize(640, 480);// Redimensionne la fenetre
this.setVisible(true);// Affiche la fenetre
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);// Permet de quiter l'application à la fermeture de la fenêtre
}
public void ModifyQueenPosition(Point point){
this.X.setValue(point.x);
this.Y.setValue(point.y);
}
}
@SuppressWarnings("serial")
class AffGrille extends JPanel{ // Classe personnelle qui crée une grile hexagonale.
final static int cote=26; // Ceci définit la taille du côté d'un polygone
int numero=0; // Retien le n° du polygone sur lequel est la souris
Polygon pol;
Graphics2D g2d;
@Override
public void paint(Graphics arg0) {
Polygon p2=getPolygon(0, 0, cote); // Crée un hexagone
Rectangle r=p2.getBounds(); // Récupère le plus petit rectangle // aux bord de la fenêtre dans lequel l'hexagone peut s'inscrire
Point hovered=null;
arg0.setColor(Color.black);
super.paint(arg0);
this.g2d=(Graphics2D) arg0;
BasicStroke bs1=new BasicStroke(1);// Permet de fixer l'épaisseur du trait dans la suite
BasicStroke bs3=new BasicStroke(3);// Idem
this.g2d.setStroke(bs1);
for(int l=0;l<30;l=l+2){// Remarquer le "+2" car la grille est constituée de 2 sous grilles (les lignes impaires sont décallées)
for(int c=0;c<30;c++){
Point p;
p=getMousePosition();
Polygon poly=getPolygon(c*r.width, (int)(l*cote*1.5),cote);
if(p!=null && poly.contains(p)){
hovered=new Point(c*r.width, (int)(l*cote*1.5));
numero=l*30+c;
pol=poly;
}
this.g2d.draw(poly);
}
}
for(int l=1;l<30;l=l+2){
for(int c=0;c<30;c++)
{
Point p;
p=getMousePosition();
Polygon poly=getPolygon(c*r.width+r.width/2, (int)(l*cote*1.5+0.5),cote);
//arg0.setColor(Color.black);
if(p!=null && poly.contains(p)){
hovered=new Point(c*r.width+r.width/2, (int)(l*cote*1.5+0.5));
numero=l*30+c;
pol=poly;
}
this.g2d.draw(poly);
}
}
if(hovered!=null){
arg0.setColor(Color.blue);
this.g2d.setStroke(bs3);
Polygon p=getPolygon(hovered.x, hovered.y,cote);
this.g2d.draw(p);
}
}
public Polygon getPolHover(){
return pol;
}
public Graphics2D getlol(){
return this.g2d;
}
public static Polygon getPolygon(int x,int y,int cote){// Forme le polygone
int haut=cote/2;
int larg=(int)(cote*(Math.sqrt(3)/2));
Polygon p=new Polygon();
p.addPoint(x,y+haut);// /
p.addPoint(x+larg,y); // \
p.addPoint(x+2*larg,y+haut);// |
p.addPoint(x+2*larg,y+(int)(1.5*cote)); // /
p.addPoint(x+larg,y+2*cote);// \
p.addPoint(x,y+(int)(1.5*cote));// |
return p;
}
} |
Partager