Grille hexagonal grande taille

virus321 Messages postés 3 Date d'inscription vendredi 4 mai 2007 Statut Membre Dernière intervention 4 décembre 2011 - 4 déc. 2011 à 17:37
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 5 déc. 2011 à 08:21
Bonjour,

Je suis entrain de construire une grille hexagonal de grande taille. Le problème est que jusqu'à disant 50/50, cela marche bien. Mais dès que je passe à des grandes tailles 100/100 ou 200/200, quand je scroll ça rame énormément. je ne sais pas pourquoi, mais du coup je n'arrive pas à faire une grille de plus de 50/50.

voici mon code :
package view;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
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 java.util.Enumeration;
import java.util.Hashtable;

import javax.media.j3d.Behavior;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.ScrollPaneConstants;
import javax.swing.WindowConstants;
import model.grid.CellContent;

/*
 * Cette classe permet d'utiliser une grille d'hexagone
 * 
 */
public class HexagonalGridWindow extends JFrame  {

private static final long serialVersionUID = 1L;
private JSpinner queenXposition;
private JSpinner queenYposition;
private Boolean clicked;
private ConfigWindow configWindow;
private int cellNumberPerLine;
private int cellNumberPerColumn;
private ColonyPanel colonyPanel;
private JScrollPane scroll;
Polygon polygon;
private Boolean repaintPoly=false;



public HexagonalGridWindow(ConfigWindow configWindow,ColonyPanel colonyPanel) {

/*Initialisation des variable de classe*/
this.clicked=false;
this.configWindow=configWindow;
this.colonyPanel=colonyPanel;
this.queenXposition=this.colonyPanel.getQueenXPosSpinner();
this.queenYposition=this.colonyPanel.getQueenYPosSpinner();
this.cellNumberPerLine=Integer.parseInt(this.configWindow.getSimFieldWidthSpinner().getValue().toString());
this.cellNumberPerColumn=Integer.parseInt(this.configWindow.getSimFieldHeightSpinner().getValue().toString());
/* Crée une instance de la classe privée GridWindow*/
final GridWindow grid=new GridWindow(this.configWindow,this); 

/* construction de la grille */
grid.setEnabled(true);
grid.setPreferredSize(new Dimension((int)(this.cellNumberPerLine*2*grid.getSide()*(Math.sqrt(3)/2)),((this.cellNumberPerColumn*(grid.getSide()+grid.getSide()/2))+(grid.getSide()/2))));
/*Ajout d'un scroll en horizental et en vertical pour notre Jframe*/
this.scroll = new JScrollPane(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.scroll.getVerticalScrollBar().setUnitIncrement(10);
this.scroll.getHorizontalScrollBar().setUnitIncrement(50);

this.scroll.setViewportView(grid);
this.scroll.setPreferredSize(new Dimension(640,640));
this.add(scroll);


if(this.cellNumberPerLine>18 && this.cellNumberPerColumn>18)
this.setSize((int)Math.round(18*2*grid.getSide()*(Math.sqrt(3)/2)),Math.round(18*(grid.getSide()+grid.getSide()/2))+(grid.getSide()/2));
else if (this.cellNumberPerLine>18) 
this.setSize((int)Math.round(18*2*grid.getSide()*(Math.sqrt(3)/2)),Math.round(this.cellNumberPerColumn*(grid.getSide()+grid.getSide()/2))+(grid.getSide()/2));	
else if (this.cellNumberPerColumn>18) 
this.setSize((int)Math.round(this.cellNumberPerLine*2*grid.getSide()*(Math.sqrt(3)/2)),Math.round(18*(grid.getSide()+grid.getSide()/2))+(grid.getSide()/2));		
else
        this.setSize((int)Math.round(this.cellNumberPerLine*2*grid.getSide()*(Math.sqrt(3)/2)),Math.round(this.cellNumberPerColumn*(grid.getSide()+grid.getSide()/2))+(grid.getSide()/2));


// Redimensionne la fenetre
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setVisible(true);// Affiche la fenetre
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);// Permet de quiter l'application à la fermeture de la fenêtre

grid.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseDragged(MouseEvent arg0) {

}

@Override

public void mouseMoved(MouseEvent arg0) {

polygon=grid.getPolygon();
//permet de redessiner et suivre le mouvement de la souris 
if(grid.contains(arg0.getPoint()) && HexagonalGridWindow.this.clicked ==false){
grid.repaint();

}


}

});
grid.addMouseListener(new MouseAdapter(){
@Override


public void mouseClicked(MouseEvent arg0) {

/*récupérer la case sélectionner par l'utilisateur*/
super.mouseClicked(arg0);
/*on modifie la position de la reine*/
ModifyQueenPosition(new Point(grid.getNumber()/cellNumberPerLine,grid.getNumber()%cellNumberPerLine));
/*on élimine la position ancienne de la reine si elle a déja été placé auparavant*/
if(GridWindow.getPolyTable().containsKey(ConfigWindow.tabPanel.getSelectedIndex()+1)){
GridWindow.getPolyTable().remove(ConfigWindow.tabPanel.getSelectedIndex()+1);
}
/* on rajouter la description de la reine à la hache table*/
CellContent queenDescription=new CellContent(grid.getNumber(),grid.getPolygon(),"Q"+(ConfigWindow.tabPanel.getSelectedIndex()+1),HexagonalGridWindow.this.colonyPanel.getColonyColor());
GridWindow.getPolyTable().put(ConfigWindow.tabPanel.getSelectedIndex()+1,queenDescription);
/* on redessine la grille*/
grid.repaint();
/*on ferme la grille après avoir positionner la reine*/
HexagonalGridWindow.this.dispose();

}
});// Evenement qui survient au clicque

}

public void ModifyQueenPosition(Point point){
this.queenXposition.setValue(point.x);
this.queenYposition.setValue(point.y);
}
public ColonyPanel getColonyPanel() {
return colonyPanel;
}
public Boolean getRepaintPoly() {
return repaintPoly;
}
public void setRepaintPoly(Boolean repaintPoly) {
this.repaintPoly = repaintPoly;
}
public Polygon getPolygon() {
return polygon;
}
}

/*Classe  qui crée une grile hexagonale*/
@SuppressWarnings("serial")
class GridWindow extends JPanel{ 
private JSpinner queenXposition;
private JSpinner queenYposition;
private int side=26; // Ceci définit la taille du côté d'un polygone
private int number=0; // Retient le n° du polygone sur lequel est la souris
private int width;
private int hight;
private Polygon polygon;
private Graphics2D g2d;
private Point hovered=null;
private HexagonalGridWindow hexGrid;
private ColonyPanel colonyPanel;
private static Hashtable queenTable=new Hashtable();

//@Override
public GridWindow(ConfigWindow configWindow,HexagonalGridWindow hexGrid){
/* initialisation des variable de classe*/
this.colonyPanel=hexGrid.getColonyPanel();
this.queenXposition=this.colonyPanel.getQueenXPosSpinner();
this.queenYposition=this.colonyPanel.getQueenYPosSpinner();
this.width=Integer.parseInt(configWindow.getSimFieldWidthSpinner().getValue().toString());
this.hight=Integer.parseInt(configWindow.getSimFieldHeightSpinner().getValue().toString());
this.hexGrid=hexGrid;

}
@Override
public void paint(Graphics arg0) {
  
Polygon p2=getPolygon(0, 0, side); // 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

arg0.setColor(Color.blue);
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<this.hight;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<this.width;c++){
Point p;
p=getMousePosition();
Polygon poly=getPolygon(c*r.width, (int)(l*side*1.5),side);
if(p!=null && poly.contains(p)){
this.hovered=new Point(c*r.width, (int)(l*side*1.5));
this.number=l*this.hight+c;
this.polygon=poly;

}
this.g2d.setColor(Color.blue);
this.g2d.draw(poly);

}
}
for(int l=1;l<this.hight;l=l+2){ // ligne impaire
for(int c=0;c<this.width;c++)
{
Point p;
p=getMousePosition();
Polygon poly=getPolygon(c*r.width+r.width/2, (int)(l*side*1.5+0.5),side);
arg0.setColor(Color.blue);
if(p!=null && poly.contains(p)){
/*hovered désigne si on est sur un polygone donnée avec la souris pour la colorer*/
this.hovered=new Point(c*r.width+r.width/2, (int)(l*side*1.5+0.5));
this.number=l*this.width+c;
this.polygon=poly;

}
this.g2d.draw(poly);


}
}

    
       
if(hovered!=null){
//colorer le polygon survoler par la souris et écrire le nom de la reine dedans//
int index=ConfigWindow.tabPanel.getSelectedIndex();
Polygon p=getPolygon(hovered.x, hovered.y,side);
this.g2d.setStroke(bs3);
this.g2d.setFont(new Font("Arial",Font.PLAIN,15));
this.g2d.setColor(hexGrid.getColonyPanel().getColonyColor());
this.g2d.drawString("Q"+(index+1),(p.xpoints[1]-7),(p.ypoints[5]+p.ypoints[0])/2); 
this.g2d.draw(p);


}


Enumeration keys = queenTable.keys();
while( keys.hasMoreElements() ) {
/*récupérer les emplacements des reines pour les réafficher quand on réouvre la grille*/
Object key = keys.nextElement();
CellContent pTable =queenTable.get(key);

this.g2d.setColor(pTable.getQueenColor());
this.g2d.drawString(pTable.getName(),(pTable.getPoly().xpoints[2]+pTable.getPoly().xpoints[0])/2-5,(pTable.getPoly().ypoints[5]+pTable.getPoly().ypoints[0])/2);
this.g2d.setStroke(bs3);
this.g2d.draw(pTable.getPoly());


}

   

}
public void ModifyQueenPosition(Point point){
this.queenXposition.setValue(point.x);
this.queenYposition.setValue(point.y);
}

public void repaintPoly(Polygon p,Graphics g){
BasicStroke bs3=new BasicStroke(3);
int index=ConfigWindow.tabPanel.getSelectedIndex();
g2d.setStroke(bs3);
g.setFont(new Font("Arial",Font.PLAIN,15));
g.setColor(hexGrid.getColonyPanel().getColonyColor());
g.drawString("Q"+(index+1),(p.xpoints[1]-7),(p.ypoints[5]+p.ypoints[0])/2); 
g.drawPolygon(p);
hexGrid.setRepaintPoly(false);
}
/*dessiner un polygon avec 6 points*/
public static Polygon getPolygon(int x,int y,int side){
int height=side/2;
int width=(int)(side*(Math.sqrt(3)/2));
Polygon p=new Polygon();
p.addPoint(x,y+height);// /
p.addPoint(x+width,y); // \
p.addPoint(x+2*width,y+height);// |
p.addPoint(x+2*width,y+(int)(1.5*side)); // /
p.addPoint(x+width,y+2*side);// \
p.addPoint(x,y+(int)(1.5*side));// |
return p;
}
public static Hashtable getPolyTable() {
return queenTable;
}
public static void setPolyTable(Hashtable polyTable) {
queenTable = polyTable;
}
public int getSide() {
return side;
}
public int getNumber() {
return number;
}
public Polygon getPolygon() {
return polygon;
}
}


Aviez vous une idée s'il vous plait ?

1 réponse

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
5 déc. 2011 à 08:21
Bonjour,

Je te donne un code que j'ai utilisé pour faire un plateau de jeu de dames, je l'ai un peu modifié et il affiche rapidement une grille 100*100. A toi de voir si tu peux en faire quelque chose. En tout cas, c'est plus simple que ce que tu as fait je pense.

Classe Case
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JPanel;


public class Case extends JPanel {

private static final long serialVersionUID = -1839026893240660968L;



public Case(Color couleur){
setLayout(new GridLayout(1,0));
setBackground(couleur);
}

}


Classe Plateau
import java.awt.Color;
import java.awt.GridLayout;

import javax.swing.JPanel;


public class Plateau extends JPanel {

private static final long serialVersionUID = 6726708245444190460L;

private static final int TAILLE=50;


public Plateau(){
setLayout(new GridLayout(TAILLE, TAILLE));
for(int i=0; i<TAILLE; i++){
for(int j=0; j<TAILLE; j++){
if((j%2==0 && i%2==0) || (j%2!=0 && i%2!=0)){
add(new Case(Color.BLACK));
}
else{
add(new Case(Color.WHITE));
}
}
}
}

}


Pour lancer :
	public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(600, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new Plateau());
f.setVisible(true);
}
0