repaint() en Java n'est pas “re-peindre” immédiatement?
J'ai un code comme ça:
//In MyPanel.java
public void paintComponent(Graphics g)
{
super.paintComponent(g);
//Draw something
mypanel_count++;
}
//In Test.java
public void testLargeData()
{
while (notDone)
{
panel.repaint();
//do huge work
test_count++;
System.out.println("Test_count: " + test_count + ", MyPanel_count: " + mypanel_count);
}
}
//Output !!!
Test_count: 752, MyPanel_count: 23
Test_count: 753, MyPanel_count: 23
Test_count: 754, MyPanel_count: 23
Test_count: 755, MyPanel_count: 24
Mais quand je change de panel.repaint()
à panel.paintComponent(panel.getGraphics())
, la sortie est à droite:
Test_count: 752, MyPanel_count: 752 Test_count: 753, MyPanel_count: 753 Test_count: 754, MyPanel_count: 754 Test_count: 755, MyPanel_count: 755
Pourquoi? paintComponent
méthode fonctionne, mais il est parfois aveugle, donc je ne veux pas l'utiliser. Quelqu'un peut me donner des suggestions? Merci!
- stackoverflow.com/questions/9389187/....
- merci pour votre réponse, mais ce n'est pas mon problème.
- avez-vous essayé JComponent.html#paintImmediately(int, int, int, int)
- paintImmediately(...) comme suggéré par mKorbel devrait aider.
stackoverflow.com/questions/4120528/repaint-in-a-loop. Je sais que ce n'est pas une réponse. Mais je suppose que la solution est de threads. SwingUtilities.invokeLater
ne fonctionne pas pour moi.- Carley question dans le présent formulaire n'est pas answearble, il y a un peu de code, toutes les méthodes pour comparisions test, ni un SSCCE, que voulez vous attend,
- Je veux trouver une solution pour les "re-peindre" immédiatement, pas aveugle, que tous.
paintImmediately
parfois aveugles. - Carley nous pouvons travaille avec donné d'infos, sinon ce sera seulement votre question personnelle, personne ne le sait ... quoi de représentant de code affiché dans votre questiod, les idées, le scénario, voler vers la lune ???, pourquoi, ce s'il vous plaît, pour mieux aider plus tôt post un SSCCE, bref, praticable, compilable, juste au sujet de h décrit problème,
- Carley dans tous les cas repeindre devrait être la dernière ligne de code, préparer tous les Objets, les mettre l'Objet dans le Tableau, à l'intérieur de paintComponent boucle dans le Tableau, puis d'appeler la repeindre, tout, tout une autre ligne de code, de plus, est inutile, simple de tout préparer avant, aucune idée à ce sujet
- Merci pour votre suggestion.
Vous devez vous connecter pour publier un commentaire.
Si vous lisez la documentation de
repeindre
attentivement, vous remarquerez qu'il stipule que (l'emphase est mienne):Cela signifie que AWT/Swing est autorisé à optimiser repeindre par la fusion repeint qui sont demandés dans une succession rapide. Il y a aussi un
repeindre(longtemps)
méthode, qui permet de contrôler combien de temps AWT/Swing est autorisé à attendre avec fullfilling repeindre votre demande. Il pourrait toujours fusionner demande si, surtout si vous le faites dans une boucle.Il pourrait être utile de lire l'article "La peinture dans AWT et Swing", qui tente d'expliquer les différents concepts impliqués.
Pour obtenir le panneau repeint pour chaque itération, vous devez attendre pour un peinture à arriver et puis continuer avec votre boucle. Cela signifie que vous avez besoin d'une synchronisation entre votre thread de traitement (la boucle) et l'AWT/Swing fil. Comme une idée, vous pouvez par exemple
wait()
sur le panneau de l'objet à la fin de votre boucle si elle n'a pas été repeint depuis le dernier appel àrepaint()
et appelnotifyAll()
à la fin de votre panneau depaintComponent()
méthode. Cependant, cela peut être difficile à mettre en œuvre le droit, donc vous ne devriez faire cela que si vous avez vraiment besoin de "temps réel" retraçage de votre composant. Comme une alternative,paintImmediately(...)
pourrait être utilisé, mais vous devez faire tout votre traitement en cas de dispatching fil, comme ceci:Notez que cela va s'arrêter tout traitement des événements, y compris la souris et le clavier en cours de traitement, tandis que la boucle est en cours d'exécution. Vous pouvez en lire plus sur le Swing et le Filetage en "La simultanéité dans Swing"
Que les autres réponses dites: c'est un problème lors de l'AWT appelle
paint()
.Si vous faites un peu travail qui a besoin d'informations de peint/relooké Composants, ce qui permet également de mettre ce travail dans un thread qui attend jusqu'à ce que la peinture est faite.
Dans votre cas, ce serait quelque chose comme:
Bien que je ne suis pas sûr de savoir comment il allait se comporter dans votre
while
boucle.consulter :
https://stackoverflow.com/a/13256847/1423083