Domanda

sto scrivendo un semplice gioco di programma Life in Java e sto avendo un po 'di problemi a farla animare. Ho un JComponent classe denominata LifeDraw , che mostra una griglia di pixel, con il seguente metodo paint:

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

E poi un'altra classe LifeGrid che ha un metodo run(), che quando viene chiamato aggiornerà la griglia di pixel per una generazione e quindi chiamare LifeDraw.repaint(). Tuttavia, se provo a chiamare run() in un ciclo, il JComponent non si ridisegna fino a quando il ciclo è finito in modo tutto ciò che è sempre visualizzata è la prima generazione e l'ultimo. Ho pensato che era probabilmente solo aggiornando troppo in fretta per ridipingere, così ho provato ad utilizzare Thread.sleep() tra le iterazioni, ma aveva ancora lo stesso problema. Teoricamente (o almeno speravo che sarebbe), dovrebbe ridisegnare il componente tra ogni iterazione e visualizzare un'animazione dei pixel cambia.

Non sono così ben versato in Java GUI, quindi ogni aiuto sarebbe molto apprezzato. Spero di aver spiegato con sufficiente chiarezza, fatemi sapere il contrario!

È stato utile?

Soluzione

Non so se sarebbe risolvere il problema, ma si potrebbe provare a chiamare run () da un Timer invece di una semplice o while.

Altri suggerimenti

Dalle JavaDocs per repaint():

  

Aggiunge la regione determinata alla lista zona sporca se il componente è   mostrando. Il componente verrà ridipinto dopo tutte le attualmente   eventi in sospeso sono stati spediti.

Tutti riverniciare fa è segnale che la zona ha bisogno di riverniciatura.
Prova paintImmediately o update.

Repaint deve essere licenziato nel ciclo di eventi, non in un altro thread.
Provare a sostituire la chiamata a repaint() con seguente codice:

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        repaint();
    }
}); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top