Mit Java JComponent repaint()
Ich Schreibe ein einfaches Spiel des Lebens-Programm in Java und habe ein wenig Mühe, es zu animieren. Ich habe eine JComponent Klasse namens LifeDraw, das zeigt ein raster von Pixeln, mit der folgende paint-Methode:
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int y = 0; y < lGrid.getHeight(); y++) {
for (int x = 0; x < lGrid.getWidth(); x++) {
if (lGrid.getCell(x,y) == 1) {
g.setColor(Color.red);
g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
} else {
g.setColor(Color.white);
g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
}
}
}
}
Dann eine andere Klasse LifeGrid, die eine Methode hat run()
, die, wenn Sie aufgerufen wird, aktualisiert das raster von Pixeln, für eine generation und rufen Sie dann LifeDraw.repaint()
. Jedoch, wenn ich versuche zu nennen run()
in einer Schleife, die JComponent nicht streichen, bis die Schleife beendet ist, also alle, die jemals angezeigt wird, ist die erste generation und die Letzte. Ich dachte, es war wahrscheinlich nur die Aktualisierung zu schnell, Sie zu streichen, also versuchte ich mit Thread.sleep()
zwischen den Iterationen hatte aber immer noch das gleiche problem. Theoretisch (oder zumindest ich hatte gehofft, es würde), sollte repaint der Komponente zwischen jeder iteration an und zeigt eine animation, in der die Pixel ändern.
Ich bin nicht so bewandert in Java-GUI, so dass jede Hilfe wäre wirklich zu schätzen. Hoffentlich habe ich es erklärt deutlich genug, lassen Sie mich wissen, ansonsten!
- könnte das gleiche problem sein wie hier: stackoverflow.com/questions/1843677/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, ob es dein problem löst, aber Sie könnten versuchen, den Aufruf der run() aus einer Timer statt einem einfachen for-oder while-Schleife.
Aus den JavaDocs für
repaint()
:Alle repaint tut, ist das signal, dass der Bereich braucht Malerarbeiten.
Versuchen
paintImmediately
oderupdate
.Repaint hat gefeuert werden, die Ereignis-Schleife, nicht in einem anderen thread.
Ersetzen Sie Ihren Anruf zu
repaint()
mit folgenden code: