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

Ignorar eventos

Estas en el tema de Ignorar eventos en el foro de Java en Foros del Web. Hola. Me gustaria saber como se pueden ignorar los eventos en un boton. He probado con boton.setenabled(false). Mientras el boton esta así lo pulso y ...
  #1 (permalink)  
Antiguo 16/08/2008, 07:05
 
Fecha de Ingreso: agosto-2008
Mensajes: 3
Antigüedad: 16 años, 3 meses
Puntos: 0
Ignorar eventos

Hola.
Me gustaria saber como se pueden ignorar los eventos en un boton.
He probado con boton.setenabled(false). Mientras el boton esta así lo pulso y todo bien, no hace nada, pero cuando hago boton.setenabled(true) saltan todos los eventos anteriores (de cuando lo pulsé mientras estaba inhabilitado).
Gracias, un saludo!
  #2 (permalink)  
Antiguo 17/08/2008, 00:46
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Ignorar eventos

Hola:

Con setEnabled(false) el botón debería ponerse gris y no dejarse pulsar. Si se está dejando pulsar y no hace nada, posiblemente es porque estás haciendo algo raro en otro sitio del código. Si se ejecutan después todos los eventos de golpe, posiblemente en algún momento estás bloqueando el hilo de eventos de java y cuando lo liberas es cuando se ejecuta todo de golpe.

Intenta hacer un código sencillo para probar si el setEnabled(false) es lo que quieres.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 17/08/2008, 06:21
 
Fecha de Ingreso: agosto-2008
Mensajes: 3
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Ignorar eventos

Hola, muchas gracias por responder.
Si, acertaste, hago un sleep para dejar la pantalla visible antes de modificarla al seguir ejecutando. Y sí setEnabled(false) hace lo que quiero (a no ser que se guarden los eventos para cuando hagas setEnabled(true)). Este es el código:

for (int i=0,i<n;i++){
buttons[i].setEnabled(false);
}

myFrame.paint(myFrame.getGraphics());

try{
Thread.sleep(3000);
}catch(Exception ex){}

for (int i=3; i<n ; i++){
buttons[i].setBackground(Color.GRAY);
}

myFrame.paint (myFrame.getGraphics());

for (int i=0 ; i<3 ; i++){
buttons[i].setEnabled(true);
buttons[i].addMouseListener(new MyMouseListener());
}

Pinto una fila de botones y los dejo visibles e inhabilitados un rato. Luego modifico todos los botones menos los tres primeros y lo muestro. Despues habilito los tres primeros botones y les añado el mouselistener. Pues bien, cuando hago esto último, si en el rato en que mostraba todos los botones pinche alguno de los tres primeros se ejecuta el mymouselistener.

Hay varias cosas que no entiendo:

- Si los botones estan inhabilitados y no dejan ser pulsados ¿por qué se guardan sus eventos?
- ¿Porqué se ejecuta el mymouselistener?, si lo añado despues...
  #4 (permalink)  
Antiguo 18/08/2008, 00:51
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Ignorar eventos

Hola:

Veo varios problemas en el código.

No debe llamarse nunca a paint() directamente. Si quieres que se repinten las ventanas, debe llamarse al método repaint(). Este método NO repinta la ventana en el momento, sino que encola la petición para más adelante, cuando java puede hacerlo. Por ello, cualquier código que haga cosas, llame a paint() o repaint() siga haciendo cosas, vuelva a llamar a paint() o repaint() y siga haciendo cosas, no tiene ninguna garantía de que se haga todo en orden. Los paint() o repaint() se ejecutan en un hilo separado, paralelo a tu código.

Si además, tu código se está ejecutando como consecuencia de un evento de teclado o ratón (un actionListener, keyListener o cualquier otro similar), el sleep() y tu codigo está bloqueando el hilo de pintado, por lo que todo lo que hagas NO se verá reflejado en las ventanas hasta que acabe tu codigo y entonces, se reflejará todo de golpe. Esto puede justificar que todos los eventos queden "encolados" y que no se deshabiliten los botones. Puedes ver todo esto algo más detallado en el hilo de awt.

Para hacer esto bien, debes lanzar hilos o timers. Echa un ojo a javax.swing.Timer.

Deberías pintar toda la ventana como la quieres y luego, para las cosas que deben suceder un tiempo después, lanzar un javax.swing.Timer y en el código de ese Timer, habilitar, poner gris o lo que quieras.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
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 13:58.