2014-04-27 4 views
0

J'ai cherché le problème, mais tout le monde semble avoir des problèmes avec la mise à jour graphique trop lent.Java Graphics mise à jour trop rapide

Pour présenter ma situation:

J'ai un JFrame que je mets à plein écran, en utilisant un mode d'affichage compatible. Dans le JFrame, j'ai un couple de JPanels et JButtons ... Sur l'un des JPanels, je dessine des objets en mouvement qui ont besoin d'être mis à jour.

Je suis en train de mettre à jour les graphiques comme ceci: valider et repeindre le JFrame, puis revalider et repeindre le JPanel correspondant. Les graphiques sont mis à jour trop rapidement. (Je dois mentionner que sur le JPanel je surcharge la méthode paintComponent). J'ai essayé d'utiliser BufferStrategy sur le JFrame, mais cela m'empêchera de montrer les JPanels et les JButtons (je ne sais pas pourquoi). Je profite également de cette occasion pour demander à certains d'entre vous si vous pouvez faire une distinction claire entre peindre, valider, repeindre, revalider, invalider, etc ... tous les tutoriels à peine gratter la surface.

+0

Vous ne devez revalider lorsqu'un composant comme cela a été ajouté/retiré de son parent. Cela n'a rien à voir avec la peinture. Veuillez expliquer ce que vous essayez de faire, et montrer une tentative ou du moins ce que vous avez déjà fait. –

+1

Pouvez-vous expliquer pourquoi vous pensez que la mise à jour est trop rapide? – FelixM

+0

La raison pour laquelle je pense que la mise à jour est trop rapide est que si j'utilise un JFrame normalement défini (nouveau JFrame, et pas un plein écran avec un mode d'affichage) cela fonctionne normalement (j'ai des boules qui bougent dans un labirint). Le code ressemble à ceci: void rollBalls() { f.validate(); f.repaint(); updateBallsSpecs(); p.revalidate(); p.repaint(); f est le JFrame et p est le JPanel dans le JFrame.La méthode de mise à jour des spécifications met simplement à jour la spécification des billes (coordonnées dans un tableau), les coordonnées que j'utilise dans la méthode paintComponent dans la classe JPanel. – user3577465

Répondre

0

« Le mécanisme de synchronisation est tout simplement une boucle qui fonctionne pendant 5 minutes en utilisant System.timeCurrentMillis compter que »

qui ne va pas au travail. La boucle bloque finalement la peinture jusqu'à ce que la boucle soit terminée, s'il n'y a pas de retard.

Je vous suggère d'utiliser un javax.swing.Timer pour l'animation. Vous pouvez voir plus à How to Use Swing Timers

La construction de base de Timer est comme suit

Timer (int delayInMillis, ActionListener listener) 

delayInMillis est le temps en millisecondes pour retarder entre « tiques » et listener fournit la actionPerformed qui est appelé à chaque delayInMillis millisecondes. Donc, en fin de compte que vous faites quelque chose comme

Timer timer = new Timer (40, new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     for (Ball ball: balls) { 
      ball.move(); 
      repaint(); 
     } 
    } 
}); 

Vous pouvez voir un exemple complet here

enter image description here

+0

Merci beaucoup, mais sur quoi dois-je appeler repeindre, sur le JFrame ou JPanel à l'intérieur de JFrame? – user3577465

+0

Si vous peignez sur le panneau, appelez repeindre sur le panneau. Voir l'exemple que j'ai lié –

+0

Merci cela fonctionne. J'ai mis à jour le JFrame ou le Jpanel puisque c'est pareil (Jpanel est un enfant de mon JFrame), je perds juste un peu du côté fps. – user3577465