2009-02-09 19 views
7

¿Hay alguna manera de obligar a una aplicación JavaFX a volver a pintar antes de continuar? Similar a un método de pintura (Graphic Graphic) de Swing Panel (podría estar equivocando las palabras clave allí).Forzar pintura inmediata en JavaFX

Considere el siguiente ejemplo: escribe una aplicación TicTacToe junto con la AI necesaria para un reproductor de computadora. Desea la capacidad de mostrar dos jugadores de computadora. Tal vez pones una pausa de dos segundos entre las vueltas de la computadora para darle un efecto de vida. Cuando presiona el botón "Ir", hay una gran pausa de falta de respuesta (el tiempo que tardan los 9 turnos con pausas falsas para que la computadora "decida") y de repente la imagen visual de la aplicación se actualiza con el estado del juego.

Parece que JavaFX vuelve a pintar una vez que finaliza el procesamiento en el subproceso de la aplicación? No estoy completamente seguro aquí.

Gracias!

+0

Creo que Swing y JavaFX tienen un modelo de subprocesamiento similar en los componentes de la GUI, p. El JPanel de Swing, botón JavaFx, solo se debe actualizar desde el hilo principal. En el ejemplo anterior, creará hilos separados que realizan las operaciones, es decir movimientos, y luego llamará a Swing.invokeLater o Platform.runLater() para obtener el hilo principal y actualizar la GUI. Si bien esto suena extraño, se hace de esta manera para sortear los problemas que se producirían si se permitiera que algún hilo actualizara la GUI. – Kerry

Respuesta

6

Tienes razón. JavaFX es impulsado por eventos y de un solo subproceso. Esto significa que la repintado y la respuesta al evento no se pueden hacer simultáneamente. Las tareas prolongadas deben ejecutarse en un hilo separado para que no bloqueen la renderización de la interfaz de usuario. Cuando la tarea finaliza, puede volver a sincronizarse con el hilo FX llamando a FX.deferAction(), que simplemente ejecutará el código en el principal. hilo.

1

Esta no será la respuesta más útil, ya que he jugado todo el tiempo con JavaFX durante medio día, pero ¿no usaría líneas de tiempo, fotogramas clave y encuadernación para realizar sus repintados en lugar de llamarlos explícitamente como usted? has descrito?

Ver this tutorial for an example.

1

El modelo de JavaFX es para separarlo de la pintura de las "cosas" en la pantalla. Esto es muy poderoso pero es un cambio con respecto a la forma en que podrías estar familiarizado.

whaley es correcto que la forma adecuada de hacer esto en JavaFX es hacer una línea de tiempo donde el movimiento se realiza cada X segundos y se dibujará en ese fotograma clave.

Si tiene alguna pregunta sobre cómo hacer esto, pruébelo y haga una nueva pregunta con algún código.