Botones con Imágenes

Estoy implemetando un juego de Simon en Java. Primera vez que trabajo en este lenguaje así que se me ha hecho algo complicado. Tengo 4 botones de distintos colores. Estoy utilizando por cada botón 2 imágenes para dar efecto de que los botones se pulsan. Para lograr esto, ultilice el siguiente código por cada botón en la función ActionPerformed:
//Imagen del boton
Runnable miRunnable = new Runnable()
{
public void run()
{
try
{
botonRojo.setIcon(new ImageIcon("imagenes/rojo.jpg"));
Thread.sleep(150);
botonRojo.setIcon(new ImageIcon("imagenes/rojo1.jpg"));
}
catch (Exception e)
{
e.printStackTrace();
}
}
};
Thread hilo2 = new Thread (miRunnable);
hilo2.start();
Todo funciona bien cuando se presionan los botones, pero a veces cuando es el turno de la maquina de mostrar la secuencia de botones las imágenes se descuadran y aparecen en un lugar de ventana fuera del botón. Ademas también me ocurre que se cambia la imagen de un botón por la de la siguiente imagen en la secuencia. Es decir, si esta en acción el botón rojo, y el siguiente es el azul, en el lugar del rojo se pone el azul...
Espero haberme explicado un poco, la verdad no se a que se debe... No se si tenga que ver con los hilos...

1 respuesta

Respuesta
1
Puede ser la forma en que estas usando los hilos lo que te este causando el problema de concurrencia pero para poder dar un diagnostico exacto necesito, si es posible, el código completo de tu programa, de esa forma podre ejecutar tu código y ver de que se trata el problema, si no es posible que me envíes tu código te recomiendo que trates esto, sin garantizarte que solucione el problema:
Lo que estas haciendo de simular que los botones se pulsan lo puedes hacer así:
1- Usa los métodos setIcon() para la imagen del botón en estado normal y setPressedIcon para la imagen del botón cuando esta presionado.
2- Usa el método doClick(300) para hacer que el botón se presione por si mismo cuando quieras que lo haga, pero este método NO puedes invocarlo dentro del actionPerformed del botón porque causarías una java. Lang. StackOverflowError, es decir, un error de desbordamiento de pila, porque estarías invocando indefinidamente el método actionPerformed del ActionListener del botón. El numero 300 es el tiempo en milisegundos que permanecerá presionado el botón.
3- Si quieres que los botones se presionen automáticamente puedes usar un hilo aparte para que haga el doClick(), y siempre que uses hilos y tengas algún método que sea invocado por esos hilos debes sincronizar esos métodos para prevenir resultados indeseados, para sincronizar un método basta con colocar la palabra reservada "synchronized" ejemplo:
public synchronized void increment() {
c++;
}
Bueno creo que eso es todo lo que puedo aconsejarte, espero que te sirva y si no tienes más inquietudes respecto a este problema te agradezco que
Logre sincronizar la ejecución de mi programa gracias a tu respuesta. Finalmente descubrí que allí estaba la falla y además estaba usando el método repaint() de la manera incorrecta, lo que generaba que las imágenes de los botones se descuadradran. Muchas gracias!

Añade tu respuesta

Haz clic para o
El autor de la pregunta ya no la sigue por lo que es posible que no reciba tu respuesta.

Más respuestas relacionadas