Cita:
Iniciado por GreenEyed No acabo de entender exactamente lo que explicas, pero hay que tener en cuenta que no se debe trabajar en el hilo de eventos puesto que si hacemos cosas, hasta que no terminemos ese hilo no puede continuar con su trabajo que es, entre otras cosas, repintar la pantalla.
En este tema del Java Tutorial explican las interacciones entre Threads y como organizar las cosas para que no se bloqueen las acciones de repintar, activar botones etc.:
S!
Pongo un ejemplo. En el siguiente programa, lo que quiero es que se muestre en pantalla un número, que va cambiando aleatoriamente entre valores del 1 al 3, durante uno o dos segundos, e imprimir el número en el que se ha quedado. El problema es que tengo que esperar a que el hilo que cambia los números termine, y haciendo esto no me repinta la pantalla, con lo cual pierdo el efecto visual de números cambiando aleatoriamente.
Si probáis el programa y luego comentáis las líneas que indico en el mismo y volvéis a ejecutar se ve claro cual es el problema.
Gracias por vuestra ayuda.
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Random;
import javax.swing.JApplet;
public class PruebaHilosRepaintSwing extends JApplet implements Runnable{
Thread hiloNumeros = null;
double numeroActual = 0; //Número que muestro en pantalla y que quiero
//imprimir en el log tras la ejecución del hilo
public void init(){
//Al pinchar en el applet ejecuto el hilo
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
ejecutarHiloNumeros();
}
});
}
public void ejecutarHiloNumeros(){
hiloNumeros = new Thread(this);
hiloNumeros.start();
//Si comento el siguiente trozo de código, el efecto de los números
//alternándose funciona correctamente, pero no se imprime en el log,
//el valor que queda en pantalla, que es lo que pretendo, ya que se ejecuta
//antes de que se ejecute el hilo
try {
//Espero a que el hiloNumeros termine su ejecución
hiloNumeros.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//Comentar hasta aquí
System.out.println("El numero actual es: " + numeroActual);
}
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.GREEN);
g.setFont(new Font("", Font.ITALIC, 50));
g.drawString("" + numeroActual, 50, 50);
}
public void run() {
Random random = new Random();
for (int i = 0; i < 40; i++){
//Voy pintando el número aleatorio
numeroActual = random.nextDouble();
repaint();
try {
hiloNumeros.sleep(60);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}