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

2D Java Discussion :

DoubleBuffering sur un Component


Sujet :

2D 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 DoubleBuffering sur un Component
    Bonjour,

    J'essaye de m'initier au double buffering Hardware pour accelerer une animation un peu lourde.
    Je souhaiterai coder quelque chose comme dans la FAQ :
    http://java.developpez.com/faq/gui/?...feringHardware

    Le probleme c'est que l'animation que je voudrais optimiser est un Component qui se trouve dans une fenetre principale. Or les methodes

    et
    ne s'applique pas à un Component mais à une Frame. donc j'ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cannot find symbol
    symbol  : method getBufferStrategy()
    Que puis-je faire ?? je debute encore un peu...

    Merci d'avance,
    a+

  2. #2
    Membre averti
    Profil pro
    Developpeur
    Inscrit en
    Décembre 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Décembre 2006
    Messages : 18
    Par défaut
    je dirais simplement activer le double buffering pour toute la fenêtre.
    Ou créer une nouvelle frame qui contient juste l'animation

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut
    mmm une nouvelle frame qui ne contient que l'animation? .. je ne comprend pas trop...
    Par exemple, voici mon code...

    J'ai une fenetre principale qui contient pleins de trucs. Des boutons, de label , des panneaux etc.. en plus cette fenetre principale contient un 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 !

  4. #4
    Membre confirmé
    Inscrit en
    Juin 2006
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 80
    Par défaut
    Je vais reposter ce thread dans le forum Interface Graphique , plutot.

    Merci au modérateur de supprimer celui là.
    a+

Discussions similaires

  1. pb envoi sur POE::Component::Client::TCP
    Par ankou29666 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 02/07/2008, 22h41
  2. Réponses: 5
    Dernier message: 28/05/2008, 09h49
  3. desacriver/activer le drag sur un Component
    Par AliJava dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 18/12/2007, 09h18
  4. Dessiner sur un Component
    Par molding dans le forum 2D
    Réponses: 5
    Dernier message: 08/08/2007, 07h48
  5. OnClick sur un component créé dynamiquement.
    Par aliwassem dans le forum Delphi
    Réponses: 3
    Dernier message: 01/11/2006, 22h04

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