2010-05-16 2 views
1

J'ai quelques problèmes pour implémenter DoubleBuffer dans mon programme. Avant de vous évanouir du mur de texte, vous devriez savoir qu'il y en a beaucoup au cas où vous auriez besoin de le savoir. L'endroit actuel où je pense avoir des problèmes est dans une méthode.DoubleBuffering en Java

J'ai récemment recherché un tutoriel sur gpwiki à propos de la double mise en mémoire tampon, et j'ai décidé d'essayer d'implémenter le code qu'ils avaient dans le code que j'essaye d'implémenter dans le doublebuffer. "java.lang.IllegalStateException: le composant doit avoir un pair valide".

Je ne sais pas si cela fait une différence si vous le savez ou non, mais ce qui suit est le code avec la méthode principale. Ceci est juste un cadre qui affiche la classe ChronosDisplay à l'intérieur. J'omis le code hors de propos avec « ... »

public class CDM extends JFrame 
{ 
    public CDM(String str) 
    { 
     super("CD:M - "+str); 
     try 
     { 
      ... 
      ChronosDisplay theGame = new ChronosDisplay(str); 
      ((Component)theGame).setFocusable(true); 
      add(theGame); 
     } 
     catch(Exception e) 
     { 
      System.out.println("CDM ERROR: " +e); 
     } 
    } 
    public static void main(String args[]) 
    { 
     CDM run = new CDM("DP_Mini"); 
    } 
} 

Voici le code où je pense que le problème réside (je pense que le problème est dans la méthode de peinture()). Cette classe est affichée dans la classe CDM

public class ChronosDisplay extends Canvas implements Runnable 
{ 
    String mapName; 
    public ChronosDisplay (String str) 
    { 
     mapName = str; 
     new Thread(this).start(); 
     setVisible(true); 
     createBufferStrategy(2); 
    } 
    public void paint(Graphics window) 
    { 
     BufferStrategy b = getBufferStrategy(); 
     Graphics g = null; 
     window.setColor(Color.white); 
     try 
     { 
      g = b.getDrawGraphics(); 
      paintMap(g); 
      paintUnits(g); 
      paintBullets(g); 
     } 
     finally 
     { g.dispose(); } 
     b.show(); 
     Toolkit.getDefaultToolkit().sync(); 
    } 
    public void paintMap(Graphics window) 
    { 
     TowerMap m = new TowerMap(); 
     try 
     { 
      m = new TowerMap(mapName); 
      for(int x=0; x<m.getRows()*50; x+=50) 
      { 
       for(int y = 0; y<m.getCols()*50; y+=50) 
        { 
         int tileType = m.getLocation(x/50,y/50); 
         Image img; 
         if(tileType == 0) 
         { 
          Tile0 t = new Tile0(x,y); 
          t.draw(window); 
         } 
         ...// More similar if statements for other integers 
      } 
      catch(Exception e) ... 
    } 
    ...// Additional methods not shown here 
    public void run() 
    { 
     try 
     { 
      while(true) 
      { 
       Thread.currentThread().sleep(20); 
       repaint(); 
      } 
     } 
     catch(Exception e) ... 
    } 
} 

Si vous êtes curieuse méthode (je doute qu'il importe), le tirage au sort() dans la classe Tile0 est:

public void draw(Graphics window) 
{ 
    window.drawImage(img,getX(),getY(),50,50,null); 
} 

Tous les pointeurs, conseils, ou des solutions sont grandement appréciées. Merci pour votre temps! : D

Répondre

1

Swing est double bufférisé par défaut donc vous n'avez pas besoin de l'implémenter vous-même.

Vous ne devriez pas utiliser la classe Canvas dans une application Swing. Cela ne mélange pas les composants AWT et Swing.

Tous les composants Swing doivent être créés sur l'EDT. Lisez le tutoriel Swing pour des exemples sur comment faire cela.

+0

Merci de m'indiquer dans la direction générale, camikr. Mais pourriez-vous me dire ce qu'est EDT? Une simple recherche sur Google ne fournit pas de résultats pertinents. – exodrifter

+0

EDT est le fil d'expédition des événements. Lisez la section du tutoriel Swing sur "Concurrency" pour plus d'informations: http://java.sun.com/docs/books/tutorial/uiswing/TOC.html – camickr

+0

Merci encore, camickr! : D – exodrifter

0

Généralement cette erreur en ce qui concerne la double mise en mémoire tampon signifie que la cible n'est pas encore visible. Essayez de pousser le début du fil après que la fenêtre soit visible et que la double stratégie de tampon soit créée

+0

Désolé, changer la méthode constructeur pour ... publique ChronosDisplay (String str) { mapName = str; setVisible (true); createBufferStrategy (2); nouveau Thread (this) .start(); } ... ne résout pas le problème (je reçois toujours la même erreur). – exodrifter

+0

Ne pas confondre visible avec affichable – finnw

1

Remplacer addNotify() et créer le BufferStrategy à partir de là:

public ChronosDisplay (String str) 
{ 
    mapName = str; 
    new Thread(this).start(); 
    // Note: no createBufferStrategy() or setVisible() 
} 

public void addNotify() { 
    super.addNotify(); 
    createBufferStrategy(2); 
} 
+0

Hmm, intéressant. Je vais devoir l'essayer un jour :) – exodrifter