Pregunta

Estoy escribiendo un juego usando Java Swing. Quiero pintar cada vez que un bucle se ejecuta con un pequeño retraso en el medio para crear un efecto de cascada en la pantalla. Creo que las rutinas de eficiencia en el sistema están colapsando las llamadas a repaint() en una sola llamada. En cualquier caso, todos los cambios se producen a la vez después de que el retardo total. ¿Hay alguna manera de forzar el sistema para volver a pintar inmediatamente y luego retrasar en cada iteración del bucle?

Mi código:

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();
}
¿Fue útil?

Solución

Se puede utilizar JComponent.paintImmediately para forzar un repintado inmediata.

EDIT: Después de leer su pregunta de nuevo se me ocurre que podría estar ejecutando la lógica en la rosca de distribución de eventos. Esto significaría que las solicitudes de redibujado no se ejecutarán hasta después de su declaración de método. Si coloca el código en otro hilo entonces que probablemente se solucionará el problema y que habrá un montón más agradable de utilizar 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();
}

Es un poco sucio, pero es de esperar que le da una idea de por dónde empezar.

Otros consejos

No estoy seguro si estoy en el camino correcto aquí, pero es éste un problema hilo? Debido a que el sueño será poner el hilo actual a dormir. Así que si el repintado está en el hilo actual, que será puesta en cola efectivamente un repintado, sostiene, a continuación, hacer cola otra repintado. Entonces los extremos del método y el bucle de procesamiento de eventos de los fuegos de rosca gráficos, la ejecución de dos repaints (contraído) haciendo que todo ocurren a la vez.

Sobre la base de que pensaba que cree que puede tener dos opciones:

  1. Ponga el código en un segundo hilo para que no detiene el hilo principal de gráficos y también porque significa que los gráficos hilo Cando una pintura al lado de la ocurrencia del sueño.

  2. Antes de dormir (no muy recomendable Me gustaría pensar), disparador del bucle de eventos para forzar el repintado suceda. Tendría que ver esto. No puedo recordar cómo hacerlo de la parte superior de la cabeza. : -)

probablemente estaría buscando en la posición # 1 como la mejor opción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top