IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces Graphiques en Java Discussion :

Mettre en place un Double Buffering


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut 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 : 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 !

  2. #2
    Gfx
    Gfx est déconnecté
    Expert confirmé
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Par défaut
    Surcharge JComponent, pas Component. Et JComponent est déjà double-bufferisé. Il n'y a rien à faire.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut
    Ouaip , ça marche , merci bien.

    sur le JComponent , c'est du double buffering software ou hardware ?

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/08/2004, 16h33
  2. Réponses: 5
    Dernier message: 28/07/2004, 11h39
  3. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 18h41
  4. Réponses: 1
    Dernier message: 02/06/2004, 13h59
  5. Comment mettre en place une structure 3 tiers.
    Par WOLO Laurent dans le forum Débats sur le développement - Le Best Of
    Réponses: 13
    Dernier message: 27/07/2003, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo