Frage

Ich bin ein einfaches Spiel des Lebens-Programms in Java zu schreiben und ein wenig Mühe habe immer es zu animieren. Ich habe ein bekomme JComponent Klasse namens LifeDraw , die ein Gitter von Pixeln zeigen, mit der folgenden Lackmethode:

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());
            }
        }
    }
}

Und dann eine andere Klasse Lifegrid , das ein Verfahren run() hat, die, wenn sie aufgerufen wird das Raster von Pixeln für eine Generation aktualisieren und dann LifeDraw.repaint() nennen. Allerdings, wenn ich versuche run() in einer Schleife zu nennen, die JComponent repaint nicht, bis die Schleife beendet ist, so dass alle, die jemals angezeigt wird die erste Generation ist und die letzte. Ich dachte, es war wohl einfach zu schnell Aktualisierung neu zu zeichnen, also versuchte ich Thread.sleep() zwischen Iterationen, aber immer noch das gleiche Problem hatte. Theoretisch (oder zumindest ich hatte gehofft, es würde), sollte es die Komponente zwischen jeder Iteration neu streichen und Ändern einer Animation der Pixel angezeigt werden soll.

Ich bin nicht so gut in Java GUI versiert, so jede mögliche Hilfe wäre wirklich zu schätzen. Hoffentlich habe ich es deutlich genug erklärt, lassen Sie mich wissen, sonst!

War es hilfreich?

Lösung

Ich weiß nicht, ob es Ihr Problem lösen würde, aber man könnte versuchen Lauf () aufrufen, von einem Timer anstelle eines einfachen für oder while-Schleife.

Andere Tipps

Von dem JavaDocs für repaint():

  

Fügt den angegebenen Bereich zu der schmutzigen Bereich Liste, wenn die Komponente   zeigt. Die Komponente wird schließlich die aktuell neu gestrichen werden   haben anstehende Ereignisse ausgelöst worden ist.

Alle repaint tun, ist Signal, dass der Bereich muss neu zu streichen.
Versuchen Sie paintImmediately oder update.

neu streichen muss in der Ereignisschleife ausgelöst wird, nicht in einem anderen Thread.
Versuchen Sie ersetzen Ihren Anruf mit folgendem Code repaint():

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        repaint();
    }
}); 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top