Mettre en place un Double Buffering
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:
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:
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:
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 !