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 :
pour la ligne qui contient le createBufferStrategy().
Code : Sélectionner tout - Visualiser dans une fenêtre à part Component must have a valid peer
Est ce que choisir un Canvas est la bonne solution ?
Comme interpreter cette Exception ?
Merci beaucoup !
A bientot !
Partager