cómo usar un temporizador de swing para iniciar / detener la animación

¿Podría alguien enseñarme cómo usar un swing timer con el siguiente propósito?

Necesito tener un polígono que comience a ser animado (animación simple como la rotación) cuando hago clic con el mouse; y deja de animar cuando hago clic de nuevo.

No tengo problemas para entender la forma en que funciona MouseListener , pero con la animación real. Traté de simular la animación con un bloque while dentro del método paint() donde dibujaría, borraría y redibujaría el polígono (para simular una rotación, por ejemplo), pero dentro del tiempo, el applet no escucharía los clics. Escucharía solo después de un rato. Necesitaría el temporizador de swing para romper el tiempo cuando hago clic en el mouse.

 import javax.swing.Timer; 

Agrega un atributo;

 Timer timer; boolean b; // for starting and stoping animation 

Agregue el siguiente código al constructor del marco.

 timer = new Timer(100, new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { // change polygon data // ... repaint(); } }); 

Anula la paint(Graphics g) y dibuja el polígono a partir de los datos modificados por actionPerformed(e) .

Finalmente, un botón que inicia / detiene la animación tiene el siguiente código en su controlador de eventos.

 if (b) { timer.start(); } else { timer.stop(); } b = !b; 

Este ejemplo controla un javax.swing.Timer usando un botón, mientras que este ejemplo relacionado responde a un clic del mouse. El último ejemplo invierte la dirección en cada clic, pero iniciar / detener es una alteración directa.

El applet no escuchará los clics porque el hilo principal (el hilo de envío del evento, EDT) está dentro del ciclo while y no está escuchando sus clics.

Necesitas otro hilo. (intente usar SwingWorker http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html )

Entonces, SwingWorker hará el ciclo while en el fondo, publicando los resultados para hacer que su polígono se mueva.

Y el EDT puede enfocarse en cualquier evento (como clics). A continuación, puede utilizar el evento click para matar a SwingWorker si desea detenerlo.

Buena suerte