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

Retrasar la ejecución de algo con Thread.sleep

Estas en el tema de Retrasar la ejecución de algo con Thread.sleep en el foro de Java en Foros del Web. ¡Hola a todos! Necesito poner una imagen a un botón, esperar unos segundos y volverle a poner otra imagen. He estado investigando y puedo hacer ...
  #1 (permalink)  
Antiguo 12/03/2016, 08:44
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 9 años, 4 meses
Puntos: 0
Retrasar la ejecución de algo con Thread.sleep

¡Hola a todos!

Necesito poner una imagen a un botón, esperar unos segundos y volverle a poner otra imagen. He estado investigando y puedo hacer uso de thread.sleep, pero no me funciona.

boton.setIcon(alegria);

try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}

boton.setIcon(tristeza);


El programa primero se espera un segundo y después pone directamente la segunda foto, pero nunca llega a poner la primera.

¿Qué ocurre?



¡Gracias de antemano!
  #2 (permalink)  
Antiguo 12/03/2016, 16:42
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Retrasar la ejecución de algo con Thread.sleep

Hola:

Java tiene un hilo propio encargado de tratar eventos de raton, teclado y pintado de ventana. Si ese código tuyo se ejecuta al pulsar un botón o pulsación de tecla, se está ejecutando en ese hilo y mientras se esté ejecutando ese código, java no pinta/repinta las ventanas.

Así que pones un icono (ese método en realidad no pinta el icono, sino que le dice al hilo de pintado de ventanas, que cuando pueda, lo pinte), esperas un segundo (bloqueando ese hilo de pintado de ventanas durante un segundo, durante el cual tampoco pintará nada), luego poner el segundo icono (nuevamente aviso al hilo de pintado para que pinte otro icono cuando pueda) y sales del código.

En el momento de salir de tu codigo, el hilo de pintado queda libre y pintará los dos iconos seguidos, porque tiene los dos avisos.

Si no quieres que esto suceda, debes liberar el hilo lo antes posible lanzando todo en un hilo separado.

Código Java:
Ver original
  1. Thread hilo =  new Thread () {
  2.     public void run() {
  3.            pintas icono 1
  4.            esperas 1 segundo
  5.            pintas icono 2
  6.     }
  7. }
  8. hilo.start();

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 12/03/2016, 17:45
 
Fecha de Ingreso: diciembre-2014
Mensajes: 17
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Retrasar la ejecución de algo con Thread.sleep

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

Java tiene un hilo propio encargado de tratar eventos de raton, teclado y pintado de ventana. Si ese código tuyo se ejecuta al pulsar un botón o pulsación de tecla, se está ejecutando en ese hilo y mientras se esté ejecutando ese código, java no pinta/repinta las ventanas.

Así que pones un icono (ese método en realidad no pinta el icono, sino que le dice al hilo de pintado de ventanas, que cuando pueda, lo pinte), esperas un segundo (bloqueando ese hilo de pintado de ventanas durante un segundo, durante el cual tampoco pintará nada), luego poner el segundo icono (nuevamente aviso al hilo de pintado para que pinte otro icono cuando pueda) y sales del código.

En el momento de salir de tu codigo, el hilo de pintado queda libre y pintará los dos iconos seguidos, porque tiene los dos avisos.

Si no quieres que esto suceda, debes liberar el hilo lo antes posible lanzando todo en un hilo separado.

Código Java:
Ver original
  1. Thread hilo =  new Thread () {
  2.     public void run() {
  3.            pintas icono 1
  4.            esperas 1 segundo
  5.            pintas icono 2
  6.     }
  7. }
  8. hilo.start();

Se bueno.
No esperaba una respuesta tan buena, muchísimas gracias. Veo que java es más sutil de lo que parece a simple vista.

Pero sigue sin compilar, me dice que ; expected, incluso aunque deje el run(){} así vacío.
  #4 (permalink)  
Antiguo 13/03/2016, 06:32
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Respuesta: Retrasar la ejecución de algo con Thread.sleep

Hola:

Si estás copiando mi código, lo he puesto de memoria, no me he preocupado de verificar que compile. Sólo quería transmitirte la idea de que en tu ¿actionPerformed? necesitas lanzar un hilo, con la clase Thread posiblemente. Echa un ojo a algún tutorial de hilos y pregunta por aquí si tienes problemas.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 14/03/2016, 14:55
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 3 meses
Puntos: 11
Respuesta: Retrasar la ejecución de algo con Thread.sleep

Es buena esa explicación, pero añado que tambien puedes usar SwingUtilities.invokeLater() que hace lo que explican
  #6 (permalink)  
Antiguo 15/03/2016, 07:12
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Retrasar la ejecución de algo con Thread.sleep

Buenas,

No, precisamente es todo lo contrario. SwingUtilities.invokeLater() ejecuta en el EDT, por lo que bloquea el hilo de eventos.

En todo caso, lo mas apropiado seria utilizar un SwingWorker en lugar de un Thread directamente.

https://docs.oracle.com/javase/tutor...ncy/index.html

Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: programa
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




La zona horaria es GMT -6. Ahora son las 12:41.