Bonjour,

Je souhaiterai un peu d'aide pour mettre en place un Double Buffering dans mon programe.

J'ai une fenetre principale qui contient pleins de trucs. Des boutons, de label , des panneaux etc.. en plus cette fenetre principale contient une instance de la classe 'SimPed' qui extend Component. C'est ce SimPed que je veux optimiser à l'aide d'un Double Buffering Hardware.

La fenetre principale:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
 
 
public class FenetrePrincipale extends JFrame{
 
//...
//...
//plein d'attributs, dont :
 
SimPed sim;
 
	public FenetrePrincipale(){
             //Nouvelle fenetre
	     super("Simulateur 2.0");
	     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             this.setExtendedState(JFrame.MAXIMIZED_BOTH);
             this.show();
 
	}
 
 
//La methode suivante est appellé par mon Main:
	public void init() {
	     //Nouvelle simulation
             this.sim = new SimPed(couloir , TICKS , simulation , scenario , TRAF);
      	     go();
	}
 
	public void go() {
 
       // Pleins d'initialisation, de JPanel, JButton , JLabel etc etc ..
       //en particulier menuBouton,  menuTemps, menuPerso...
       // Puis mise en place des composants:
 
 
        this.getContentPane().removeAll();
        this.getContentPane().add(sim, BorderLayout.CENTER);        
        this.getContentPane().add(menuBouton , BorderLayout.WEST); 
        this.getContentPane().add(menuTemps , BorderLayout.SOUTH); 
        this.getContentPane().add(menuPerso, BorderLayout.EAST);      
 
        this.pack();
        this.setExtendedState(JFrame.MAXIMIZED_BOTH);
        this.show();			
	}
}

Et la classe SimPed:


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
import java.awt.*;
 
//Pleins d'import...
 
 
class SimPed extends Component{
 
   // boucle d'affichage
   RenderingThread renderingThread = new RenderingThread(); 
   // variable permettant d'utiliser la mémoire VRAM
   BufferStrategy strategy; 
   // buffer mémoire où les images et les textes sont appliqués
   Graphics2D g; 	
   // image mémoire correspondante au buffer
   Image image; 
 
  // Et pleins d'autres attributs que je ne detail pas.
 
 
    public SimPed(......) {
    	//Constucteur
 
    	setBackground(Color.white);
 
      // inhibe la méthode courante d'affichage du composant 
      setIgnoreRepaint( true );  
 
      // on créé 2 buffers dans la VRAM donc c'est du double-buffering
      createBufferStrategy( 2 ); 
 
      // récupère les buffers graphiques dans la mémoire VRAM
      strategy = getBufferStrategy(); 
      g = (Graphics2D)strategy.getDrawGraphics();
      renderingThread.start();  
 
    }
 
    public void graphicalRender(){
    	//Rafraichit l'affichage
 
		 //création du buffer si il n'existe pas
		 if(g==null){
		    image = createImage(1000,700);
		    g = (Graphics2D)image.getGraphics();
		  }
 
 
		 //on dessine sur le buffer mémoire
 
//Ici je vous passe une centaine de ligne du type 
// g.fillRect(..) ou
// g.drawoval(...)
//..
//Le graphics g , contient desormais ce que je dois dessiner.
 
		// finalement, le buffer mémoire est dessiné dans le buffer d'affichage
		 strategy.show(); 
 
 
    }
 
   public void update(Graphics g){
      paint(g);
   }
 
 
 	class RenderingThread extends Thread {
     /**
      *  Ce thread appelle le rafraichissement de notre fenêtre 
      *  toutes les 10 milli-secondes
      */
      public void run(){
         while(true){
            try {
               graphicalRender();
               sleep( 10 );
            } catch ( Exception e ) {} 
         }
      }
 
 	}
 
}

Voila alors un Component n'implemente pas la methode createBufferStrategy(int) , donc ce code ne marche pas.
Si j'essaye de remplacer le Component par un Canevas, le code compile mais j'obtient une exception à l'execution :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
Component must have a valid peer
pour la ligne qui contient le createBufferStrategy().

Est ce que choisir un Canvas est la bonne solution ?
Comme interpreter cette Exception ?

Merci beaucoup !

A bientot !