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

AWT/Swing Java Discussion :

Double-Buffer et JPanel


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 61
    Par défaut Double-Buffer et JPanel
    Bonjour,

    Voilà, j'ai un petit problème pour placer d'un coté (gauche) une colonne de bouton, et a droite une zone pour dessiner en double-buffer.

    J'ai d'abord fait ceci SANS double buffer, en créant deux JPanel (bouton / dessin), comme ceci:

    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
     Container contentPane = getContentPane(); 
     
          //zone dessin
          canvas = new JPanel(); 
     
          contentPane.add(canvas, "Center"); 
     
          //bouton
          JPanel p = new JPanel(); 
          p.setLayout( new GridLayout(nbCannon,0));
     
    	addButton(p, "Start", new ActionListener() {
     
                       //blabla est un thread...
                       new blabla(canvas); // j envoi le jpanel pour dessiner dedans...
     
                    //dans le thread blabla je recupete le Jpanel
                   // Graphics g = canvas.getGraphics()
                  // puis g.Draw....
     
    }
     
     contentPane.add(p, "West"); 
    }
     
    public void addButton(Container c, String title, ActionListener a) {
       JButton b = new JButton();
     
          c.add(b); 
          b.addActionListener(a); 
       }
    mais bon.. problèmeme ça clignote pas mal..
    j'ai donc voulut mettre du double-buffer "hardware"

    j'ai modifier en en ajoutant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       createBufferStrategy( 2 ); 
       strategy = getBufferStrategy();
    maintenant pour dessiner je doit utiliser le strategy
    en faisant Graphics g = strategy.getDrawGraphics();
    puis g.draw...

    mais la le probleme c'est que ça m'affiche depuis le coin 0,0 et donc ca dessine SUR les boutons....

    Je ne sais pas comment faire pour forcer a dessiner dans le JPnale de droite..

    SI quelqu'un pouvait me donner un coup de main, ou me conseiller si il pense que ma méthode n'est pas la bonne ?


    d'avance merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Je pense que tu devrais simplement utiliser la methode JComponent.setDoubleBuffered(), sur ton JPanel.

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 61
    Par défaut
    j'ai lu sur ce forum que faire setDOublebuffered, était inutile, vallait mieu le faire a la main

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Ca m'etonne.

    Le double buffering est une fonctionnalité quasi obligatoire des toolkits graphiques, et swing le gère par défaut.

    Peux tu m'indiquer ou tu as vu ca (je n'ai pas trouvé) ?

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 61

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    J'ai lu le post.

    Mais je te confirme que tu peux faire confiance a JComponent.setDoubleBuffered().

    Par contre, il faut quand meme rester dans le framework pour que ca marche.

    Dans le commentaire du code que tu as envoyé, j'ai vu un truc suspect:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Graphics g = canvas.getGraphics();
    Ce qui veut dire que tu crees un Graphics pour dessiner directement à l'écran.

    Y a-t-il une raison pour ca?

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 61
    Par défaut
    En effet c'est la méthode pour afficher dans le JPanel canvas

    c'est la méthode "sans double buffer"

    mais...
    J'ai partiellement répondu a mon post.

    A la place d'utilise du Hardware double-buffer, j'utilise du soft.

    je cree une image dans le Frame
    image = createImage(w,h);

    Je Cree mes boutton, quand mes bouttons sont pressés, je cree un thread blabla, en luis envoyant le JPanel ET image
    BALL test = new BALL(Image,canvas);

    dans un BALL,
    GRaphics buffer = image.getGraphics();

    buffer.drawImage(mon sprit,x,y,null);

    canvas.getGraphics().drawImage(image,0,0,null);

    et voila j'ai mon double buffer DANS le bon JPanel.

    Quand je dis que j'ai répondu partiellement a ma qestion, c'est que l'effect n'est toujours pas tres bon...

    Dans mon projet j'ai deux thread:
    - un avions qui bouge dans tous les sens
    - des balles qui bouges aussi

    Et un Background.

    Le probleme c'est que je ne trouve pas la bonne méthode pour afficher tout ca sans que ca clignote...

    Puisque ca chaque fois que je press un bouton un thread Ball est cree. je ne peut pas faire un buffer pour chaque...

    donc je suis perdu

  8. #8
    Membre confirmé
    Inscrit en
    Octobre 2005
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 61
    Par défaut
    SI quelqu'un a un schema a me proposer, je suis prenneur

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Février 2007
    Messages
    572
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Février 2007
    Messages : 572
    Par défaut
    Juste une remarque, Component.getGraphics() crée systematiquement un contexte graphique.

    Sinon, si tu veux faire un jeu, je te conseille de lire ici ou n'importe quel autre doc sur le net qui parle de java, game, graphics.
    Il y a toujours une partie sur le double buffering.

Discussions similaires

  1. JPanel double buffer
    Par adn013 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 14/08/2007, 09h43
  2. [JPanel] Double Buffering
    Par sliderman dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/06/2007, 09h51
  3. [MFC] Scinttillement vs Double buffering
    Par DamessS dans le forum MFC
    Réponses: 9
    Dernier message: 07/04/2005, 09h01
  4. Réponses: 7
    Dernier message: 03/08/2004, 16h33
  5. [Exception]Double buffering & NullPointerException
    Par Seiya dans le forum API standards et tierces
    Réponses: 25
    Dernier message: 09/07/2004, 18h41

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