Frage

Ich schreibe ein Spiel mit Java Swing. Ich möchte, jedes Mal malen, eine Schleife mit einer geringen Verzögerung führt zwischen einem Kaskadeneffekt auf dem Bildschirm zu erzeugen. Ich glaube, dass die Effizienz Routinen im System werden die Anrufe an repaint() in einen einzigen Aufruf kollabieren. Jedenfalls treten die Änderungen auf einmal nach der Gesamtverzögerung. Gibt es eine Möglichkeit, das System zu zwingen, sofort neu zu zeichnen und dann Verzögerung bei jeder Iteration der Schleife?

Mein Code:

for(int i=0;i<10;i++){
    JButton[i].setBackground(Color.WHITE);
    JButton[i].repaint();
    Thread.sleep(2000);
    JButton[i].setBackground(Color.GRAY);
    JButton[i].repaint();
}
War es hilfreich?

Lösung

Sie können JComponent.paintImmediately verwenden, um eine sofortige Repaint zu erzwingen.

EDIT: Nach der Lektüre Ihrer Frage wieder fällt mir ein, dass Sie vielleicht Ihre Logik auf dem Event Dispatch Thread werden ausgeführt wird. Dies würde bedeuten, dass die repaint Anträge erst nach Ihrer Methode zurückgeführt werden. Wenn Sie Ihren Code in einen anderen Thread gestellt, dann wird das wohl das Problem beheben, und es wird viel schöner als die Verwendung von paintImmediately sein.

void uiFunction() {
    new Thread() {
        public void run() {
            for(int i = 0; i < 10; i++) {
                final JButton b = buttons[i];
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.WHITE);
                    b.repaint();
                }
                Thread.sleep(2000);
                SwingUtilities.invokeLater(new Runnable() {
                    b.setBackground(Color.GRAY);
                    b.repaint();
                }
            }
        }
    }.run();
}

Es ist ein bisschen schmutzig, aber hoffentlich es gibt Ihnen eine Vorstellung davon, wo man anfangen soll.

Andere Tipps

Nicht sicher, ob ich auf dem richtigen Weg bin hier, aber das ist ein Thread Problem? Da der Schlaf wird den aktuellen Thread zu schlafen setzen. Also, wenn der Neuzeichnungsindex auf dem aktuellen Thread ist, werden Sie effektiv sein, ein Repaint Warteschlange, hält, dann eine andere repaint Warteschlangen. Dann endet das Verfahren und die Ereignisverarbeitungsschleife der Grafiken Faden feuert, Ausführen zwei repaints (kollabiert) macht alles auf einmal passieren.

auf dieser Grundlage dachte, ich glaube, Sie haben zwei Möglichkeiten könnten:

  1. Setzen Sie den Code auf einem zweiten Thread, so dass es nicht die Hauptgrafik Thread und auch nicht zu stoppen, weil es bedeutet, dass die Grafik einfädeln cando einen Neuzeichnen an der Seite des Schlaf passiert.

  2. Bevor Sie schlafen (nicht wirklich zu empfehlen würde ich denken), Trigger, um die Ereignisschleife die repaint zu zwingen, passieren. Ich würde dies zu sehen. Kann mich nicht erinnern, wie es aus der Spitze von meinem Kopf zu tun. : -)

Ich würde wahrscheinlich auf Platz # 1 als die beste Option suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top