repaint() in Java nicht "re-paint" sofort?
Habe ich einen code wie:
//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
Aber wenn ich panel.repaint()
zu panel.paintComponent(panel.getGraphics())
, das stimmt:
Test_count: 752, MyPanel_count: 752 Test_count: 753, MyPanel_count: 753 Test_count: 754, MyPanel_count: 754 Test_count: 755, MyPanel_count: 755
Warum? paintComponent
Methode funktioniert, aber es ist manchmal blind, so dass ich nicht wollen, es zu benutzen. Kann jemand mir einige Tipps geben? Danke!
stackoverflow.com/questions/9389187/....
vielen Dank für deine Antwort, aber es ist nicht mein ärger.
haben Sie versucht, JComponent.html#paintImmediately(int, int, int, int)
paintImmediately(...) wie vorgeschlagen von mKorbel sollte helfen.stackoverflow.com/questions/4120528/repaint-in-a-loop. Ich weiß, das ist nicht ein Antwort. Aber ich denke, die Lösung ist threads.
vielen Dank für deine Antwort, aber es ist nicht mein ärger.
haben Sie versucht, JComponent.html#paintImmediately(int, int, int, int)
paintImmediately(...) wie vorgeschlagen von mKorbel sollte helfen.
SwingUtilities.invokeLater
arbeiten nicht für mich.
InformationsquelleAutor Bood Carley | 2012-11-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie Lesen Sie in der Dokumentation
streichen
gezielt, Sie werden feststellen, dass es besagt, dass (Hervorhebung von mir):Dies bedeutet, dass AWT/Swing ist erlaubt zu optimieren Malerarbeiten durch die Verschmelzung neu, angefordert werden in schneller Folge. Es gibt auch eine
repaint(long time)
Methode, die es Ihnen ermöglicht zu kontrollieren, wie lange AWT/Swing erlaubt ist, zu warten und es erfüllte Sie Ihren repaint Wunsch. Es könnte immer noch merge-Anforderungen, obwohl, vor allem, wenn Sie Sie in einer Schleife.Es könnte hilfreich sein, um den Artikel zu Lesen "Painting in AWT and Swing", die versucht zu erklären, dass die verschiedenen Konzepte beteiligt.
Um das panel neu gezeichnet, für jede iteration, Sie würde warten, bis die Farbe zu passieren, und dann fahren Sie mit Ihrer Schleife. Das heißt, Sie müssen einige Synchronisation zwischen Threads Verarbeitung (die Schleife) und die AWT - /Swing-thread. Als grobe Idee, man könnte zum Beispiel
wait()
auf das panel-Objekt am Ende der Schleife, wenn es nicht mehr gestrichen worden, die seit dem letzten Aufrufrepaint()
- und call -notifyAll()
am Ende Ihres PanelspaintComponent()
Methode. Dies kann jedoch schwierig sein, zu implementieren rechts, so sollten Sie dies nur tun, wenn Sie wirklich brauchen, "real-time" Neuzeichnen der Komponente. Als alternative,paintImmediately(...)
könnte verwendet werden, aber Sie würde alles tun, Ihre Verarbeitung in den event-dispatching thread, wie diesem:Beachten Sie, dass dies wird stop-jeder event-Verarbeitung einschließlich Maus-und Tastatureingaben verarbeitet, während die Schleife ausgeführt wird. Lesen Sie mehr über Swing und Threading in "Concurrency in Swing"
InformationsquelleAutor Simon Lehmann
Als die anderen Antworten sagen: es ist ein problem beim AWT ruft
paint()
.Wenn Sie etwas tun, braucht Informationen aus lackiert/gelayoutet Komponenten, was hilft, ist auch diese Arbeit in einen worker-thread, der wartet, bis das Bild fertig ist.
In deinem Fall wäre das dann so etwas wie:
Obwohl ich nicht sicher bin, wie würde es sich Verhalten, in Ihrem
while
Schleife.InformationsquelleAutor Terry
beziehen :
https://stackoverflow.com/a/13256847/1423083
InformationsquelleAutor Mukul Goel