je n’ai pas surcharger la méthode paintComponent, j ai pas trouvé dans le sdk, par contre j ai surchargé la méthode paint
le graphique dessine le jeu du solitaire en 2D et en vue de dessus.
le graphique observe l’instance plat de la classe Plateau ( à chaque changement de mon modèle, la vue change ).
le graphique permet un drag and drop d’une des boules, d’où les méthodes selectedBall et tout le tralala.
Etant donné que je fais appel à beaucoup de repaint() lors du drag and drop, j ai des trames qui apparraissent et c est normal, mais y a t il un moyen d’optimiser le rendu?
public class Graphique extends Canvas implements Observer{
public final Color DARK_BROWN=new Color(171,101,0);
public final Color LIGHT_BROWN=new Color(223,166,84);
public final Color DARK_BLUE=new Color(0,0,150);
public final Color LIGHT_BLUE=new Color(0,0,200);
private final int MARGIN=32;
private final int CASE_SIZE=35;
private Case selectedBall;
private int deltaX;
private int posX;
private int deltaY;
private int posY;
private boolean clicked;
private Plateau plat;
public Graphique(Plateau plateau){
plat=plateau;
clicked=false;
selectedBall=null;
plat.addObserver(this);
}
public void selectedBall(Case c,int x, int y){
if(c==null){
throw new IllegalArgumentException("argument is null");
}
selectedBall=c;
deltaX=x-(c.getX()*CASE_SIZE+MARGIN);
deltaY=y-(c.getY()*CASE_SIZE+MARGIN);
posX=x-deltaX;
posY=y-deltaY;
clicked=true;
repaint();
}
public void diselectedBall(){
selectedBall=null;
clicked=false;
repaint();
}
public Case getSelectedBall(){
return selectedBall;
}
public Case getCase(int x,int y){
int tempX,tempY;
tempX=(int) ((x-MARGIN)/(1.*CASE_SIZE));
tempY=(int) ((y-MARGIN)/(1.*CASE_SIZE));
if(tempX<0 || tempX>6 || tempY<0 || tempX>6 ){
return null;
}
if((tempX<2 || tempX>4) && (tempY<2 || tempY>4)){
return null;
}
return plat.getCase(tempX,tempY);
}
public void paint(Graphics g){
super.paint(g);
drawPlateau(g);
drawBalls(g);
g.dispose();
}
private void drawPlateau(Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0,0,(int)this.getSize().getWidth(),(int)this.getSize().getHeight());
g.setColor(DARK_BROWN);
g.fillOval(15,15,270,270);
g.setColor(LIGHT_BROWN);
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
if( (i>=2 && i<=4) || ( j>=2 && j<=4 && (i<2 || i>4)) ){
g.fillOval(i*CASE_SIZE+MARGIN,j*CASE_SIZE+MARGIN,25,25);
}
}
}
}
private void drawBalls(Graphics g){
g.setColor(DARK_BLUE);
for(int i=0;i<7;i++){
for(int j=0;j<7;j++){
if( (i>=2 && i<=4) || ( j>=2 && j<=4 && (i<2 || i>4)) ){
if(plat.getCase(i,j)!=null && !plat.getCase(i,j).isEmpty()){
if(plat.getCase(i,j)==selectedBall && clicked==true ){
g.fillOval(posX,posY,25,25);
} else {
g.fillOval(i*CASE_SIZE+MARGIN,j*CASE_SIZE+MARGIN,25,25);
}
}
}
}
}
}
public void update(Observable arg0, Object arg1) {
repaint();
}
public void changeCoordonnate(int x, int y) {
if(clicked){
posX=x-deltaX;
posY=y-deltaY;
repaint();
}
}
}
je posterai ma classe Controller pour mon probleme de listener dans un autre post, celui-ci est déjà assez long.