Domanda

Sto scrivendo un gioco utilizzando Java Swing. Voglio dipingere ogni volta che un ciclo viene eseguito con un piccolo ritardo in mezzo per creare un effetto a cascata sullo schermo. Credo che le routine di efficienza nel sistema sono al collasso le chiamate a repaint() in una singola chiamata. In ogni caso, i cambiamenti avvengono tutte in una volta, dopo il ritardo totale. C'è qualche modo per forzare il sistema di ridipingere immediatamente e quindi ritardare su ogni iterazione del ciclo?

Il mio codice:

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();
}
È stato utile?

Soluzione

È possibile utilizzare JComponent.paintImmediately per forzare un ridisegno immediato.

EDIT: Dopo aver letto la tua domanda ancora una volta mi viene in mente che si potrebbe eseguire la logica sul thread evento spedizione. Ciò significherebbe che le richieste ridipingere non saranno eseguiti fino a dopo le vostre metodo restituisce. Se mettete il vostro codice in un altro thread allora che probabilmente risolvere il problema e sarà un bello molto rispetto all'utilizzo paintImmediately.

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

E 'un po' sporco, ma si spera che vi dà un'idea di dove cominciare.

Altri suggerimenti

Non è sicuro se sono sulla strada giusta qui, ma questo è un problema di discussione? Perché il sonno sarà mettere il thread corrente a dormire. Quindi, se il ridisegno è sul thread corrente, sarà in coda in modo efficace un ridisegno, la detenzione, poi la fila un'altra riverniciare. Allora il metodo estremità e il ciclo di elaborazione caso di incendi filo grafici, esecuzione due ridisegna (compresso) rendendo tutto avvengono contemporaneamente.

In base a questo pensiero penso che si potrebbe avere due opzioni:

  1. Inserire il codice in un secondo thread in modo che non si ferma il principale filo grafica e anche perché significa che la grafica filetto Cando un ridisegno lungo il lato l'happening di sonno.

  2. prima di dormire (non proprio raccomandato penserei), grilletto il ciclo degli eventi per forzare il ridisegno accada. Avrei dovuto cercare questo in su. Non ricordo come si fa fuori dalla parte superiore della mia testa. : -)

Probabilmente sarei guardando 1 # come l'opzione migliore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top