2010-08-08 8 views
5

J'ai (ce que je pensais) une BufferStrategy simple pour un JFrame. Il est créé comme ceci:"Tampons n'ont pas été créés" ... tout en créant des tampons

// Buffer 
    container.createBufferStrategy(2);   
    strategy = container.getBufferStrategy(); 

Cependant, je reçois occassionally l'erreur suivante (qui pointe vers la première ligne de l'extrait de l'élément comme précédente incriminé):

java.lang.IllegalStateException: buffers n'ont pas été créés

Cette erreur est particulière car elle va et vient - parfois elle est déclenchée, parfois non. Je suspect cela signifie que c'est un problème de threading. Est-ce que quelqu'un a des indications sur ce qui pourrait se passer ici? Je suis un peu perplexe, puisque j'essaie déjà de faire ce que Java me dit de faire!

modifier: trace complète:

Exception in thread "main" java.lang.IllegalStateException: Buffers have not been created 
     at sun.awt.windows.WComponentPeer.getBackBuffer(WComponentPeer.java:877) 
     at java.awt.Component$FlipBufferStrategy.getBackBuffer(Component.java:3815) 
     at java.awt.Component$FlipBufferStrategy.updateInternalBuffers(Component.java:3800) 
     at java.awt.Component$FlipBufferStrategy.createBuffers(Component.java:3791) 
     at java.awt.Component$FlipBufferStrategy.<init>(Component.java:3730) 
     at java.awt.Component$FlipSubRegionBufferStrategy.<init>(Component.java:4253) 
     at java.awt.Component.createBufferStrategy(Component.java:3612) 
     at java.awt.Window.createBufferStrategy(Window.java:3015) 
     at java.awt.Component.createBufferStrategy(Component.java:3536) 
     at java.awt.Window.createBufferStrategy(Window.java:2990) 
+0

ajouter une trace S'il vous plaît complète de la pile à votre question - il devrait aider à savoir * qui * méthode est de lancer l'ISE. J'ai regardé les sources jre (1.7) mais je n'ai pas trouvé de source potentielle pour cette exception. –

+0

Est-ce vraiment la trace de la pile complète? Nous recherchons des preuves que vous appelez de l'EDT. Allez-y et montrez la trace de la pile * full *. –

+0

@Kevin Day, 'Exception dans le fil" principal "' suggère que ce n'est pas de l'EDT. – finnw

Répondre

1

composants Swing sont à double mémoire tampon par défaut, donc il n'y a pas besoin de jouer avec un BufferStrategy. Toutefois, lorsque vous obtenez des erreurs aléatoires comme cela, c'est généralement parce que le code n'est pas exécuté sur l'EDT. Lisez la section du tutoriel Swing sur Concurrency pour plus d'informations.

+0

J'ai tendance à préférer la mise à jour manuelle des graphiques. Avoir accès à un objet BufferStrategy rend cette opération plutôt simple: dessiner une charge d'éléments sur les graphiques, puis appeler strategy.show() une fois que j'ai terminé. Corrigez-moi si c'est une horrible façon de faire les choses! Je vais certainement lire un peu plus sur la concurrence. –

+2

Je pensais que ma suggestion montrait mon opinion sur l'utilisation d'un BufferedStrategy que je crois peut-être utile lors de l'utilisation de AWT mais comme je l'ai mentionné, Swing est différent. Le tuturial a aussi une section sur "Custom Painting" vous devriez regarder – camickr

3

Le cadre doit être affichable lorsque vous appelez createBufferStrategy. Aussi, comme camickr a souligné que vous avez besoin de l'appeler de l'EDT.

Une façon d'y parvenir est d'étendre JFrame et passer outre addNotify:

class MyFrame extends JFrame { 
    public void addNotify() { 
     super.addNotify(); 
     // Buffer 
     createBufferStrategy(2);   
     strategy = getBufferStrategy(); 
    } 
}