Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con animación (Threads)

Estas en el tema de Problema con animación (Threads) en el foro de Java en Foros del Web. Estoy desarrollando un simulador de tiradas de dados, el problema viene con las animaciones de los dados y como obtener el resultado de las tiradas. ...
  #1 (permalink)  
Antiguo 23/07/2011, 06:34
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 8 meses
Puntos: 1
Problema con animación (Threads)

Estoy desarrollando un simulador de tiradas de dados, el problema viene con las animaciones de los dados y como obtener el resultado de las tiradas. Tengo creado un JPanel que implementa runnable, en ese clase tengo el run que me cambia aleatoriamente la imagen de los dados simulando la tirada y funciona bien. El problema es que desde la clase donde hago el start de esos hilos no tengo manera de poder recuperar cual es el último número en el que se quedó el dado. Hasta ahora lo hacía de la siguiente manera

Código:
hiloDado1 = new Thread(panelDado1);
hiloDado2 = new Thread(panelDado2);
hiloDado1.start();
hiloDado2.start();
					
tempDado1 = d1.tira();
tempDado2 = d2.tira();
panelDado1.setImg(tempDado1);
panelDado2.setImg(tempDado2);
Es decir, haciendo una última tirada tras la animación. El problema es que al hacer el start de los hilos estos siguen cambiado la imagen y la que pongo con setImg queda sobreescrita. He intentado hacer un join a los hilos pero entonces no se ve la animación de los dados. ¿A alguien se le ocurre alguna manera de implementarlo?

Muchas gracias.
  #2 (permalink)  
Antiguo 23/07/2011, 09:59
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Problema con animación (Threads)

Hola,

Cuando creas una aplicación basada en el ambiente gráfico como AWT o Swing no puedes modificar o llamar a los métodos de los componentes (Component) desde otro hilo porque estas librerías gráficas no son multithreading.

El método clásico que se usa es 'programación orientada a eventos', se crean interfaces para que el programa principal pueda invocar métodos específicos de los hilos y estos últimos generan eventos que son escuchados por el programa principal.

Por ejemplo, las clases que contienen los hilos pueden tener métodos que afectan su comportamiento y que pueden ser llamadas desde el main, estas mismas clases tienen varios método que permiten agregar Listeners, el main debe implementar esos Listeners y agregarse el mismo con addEventListener (también funciona con clases auxiliares como delegados).

Cuando el hilo se detiene o desea informar al main sobre algúna acción que ocurrió, la clase que ejecuta el hilo genera el evento, como el main estaba escuchando por eventos entonces recibe un mensaje, ese mensaje puede contener cualquier información que sea necesaria, como el objeto que emitio el evento, el status y cualquier otra información relevante.

Así el main se encarga de realizar las acciones reales en el hilo de AWT y Swing, que como dijimos al principio no pueden ser usados desde multiples hilos. El manejo real de las acciones debe estar muy bien diseñado para que la aplicación funcione correctamente.

Para comprender como funciona el sistema de eventos puedes buscar información sobre EventListenerList, java.awt.event así como javax.swing.event, como por ejemplo: http://www.java2s.com/Tutorial/Java/...stenerList.htm

Saludos,

Última edición por HackmanC; 23/07/2011 a las 10:06 Razón: edit
  #3 (permalink)  
Antiguo 23/07/2011, 10:20
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Problema con animación (Threads)

Hola,

Para ser mas específico puedes probar lo siguiente:

Código Java:
Ver original
  1. package org.sample;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.util.EventListener;
  6.  
  7. import javax.swing.event.EventListenerList;
  8.  
  9. public class Worker extends Thread {
  10.  
  11.     private EventListenerList actionListenerList = new EventListenerList();
  12.  
  13.     @Override
  14.     public void run() {
  15.         try {
  16.             Thread.sleep(1000 * 5);
  17.             System.out.println("Working...");
  18.             Thread.sleep(1000 * 5);
  19.             fireActionPerformed(new ActionEvent(this, 1000, "FIN"));
  20.         } catch (InterruptedException e) {
  21.             System.err.println(e);
  22.         }
  23.     }
  24.  
  25.     public void addActionListener(ActionListener actionListener) {
  26.         actionListenerList.add(ActionListener.class, actionListener);
  27.     }
  28.  
  29.     public void removeActionListener(ActionListener actionListener) {
  30.         actionListenerList.remove(ActionListener.class, actionListener);
  31.     }
  32.  
  33.     protected void fireActionPerformed(ActionEvent actionEvent) {
  34.         EventListener listenerList[] = actionListenerList.getListeners(ActionListener.class);
  35.         for (int i = 0, n = listenerList.length; i < n; i++) {
  36.             ((ActionListener) listenerList[i]).actionPerformed(actionEvent);
  37.         }
  38.     }
  39.  
  40. }


Código Java:
Ver original
  1. package org.sample;
  2.  
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5.  
  6. public class Main implements ActionListener {
  7.  
  8.     public static void main(String[] args) {
  9.         Main main = new Main();
  10.         for (int i = 0; i < 5; i++) {
  11.             Worker worker = new Worker();
  12.             worker.addActionListener(main);
  13.             worker.start();
  14.         }
  15.     }
  16.  
  17.     @Override
  18.     public void actionPerformed(ActionEvent e) {
  19.         System.out.println("El objeto " + e + " ha finalizado con ID " + e.getID() + ".");
  20.     }
  21.  
  22. }

En este caso es el main el que recibe el evento cuando se ha finalizado de ejecutar el worker, y toda la información relevante del objeto que finalizó se recibe en ActionEvent e, también puedes crear una clase que extienda ActionEvent para que contenga la información que creas necesaria.

Saludos,
  #4 (permalink)  
Antiguo 24/07/2011, 05:48
Avatar de WalterBishop  
Fecha de Ingreso: julio-2011
Mensajes: 12
Antigüedad: 12 años, 8 meses
Puntos: 1
Respuesta: Problema con animación (Threads)

Esta tarde o mañana en cuanto tenga un rato libre me pondré con ello a ver que sale pero con toda la info que me has dado sale fijo! Muchas gracias HackmanC.
  #5 (permalink)  
Antiguo 24/07/2011, 07:39
 
Fecha de Ingreso: junio-2008
Mensajes: 54
Antigüedad: 15 años, 8 meses
Puntos: 19
Respuesta: Problema con animación (Threads)

Muy interesante lo que dice HackmanC, es una forma de usar interface grafica e hilos.
  #6 (permalink)  
Antiguo 24/07/2011, 11:02
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 1 mes
Puntos: 260
Sonrisa Respuesta: Problema con animación (Threads)

Hola,

Cita:
Iniciado por WalterBishop Ver Mensaje
... a ver que sale pero con toda la info que me has dado sale fijo!
Cita:
Iniciado por Isakmtz Ver Mensaje
... es una forma de usar interface grafica e hilos.
Posiblemente tenga que aclarar que solamente es una idea muy básica, puesto que solamente mostré como pasar un mensaje entre dos clases por medio de eventos. El problema que hace falta y que tienes que investigar es que el método actionPerformed se ejecuta en el hilo y no en el main, por eso debe ser muy bien diseñado y posiblemente sincronizado para que funcione correctamente.

Saludos,

Etiquetas: animacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 01:10.