Ver Mensaje Individual
  #2 (permalink)  
Antiguo 21/06/2011, 21:12
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 17 años
Puntos: 260
Sonrisa Respuesta: KeyListener y timers

Hola,

El hilo que está ejecutando el KeyListener seguramente es el hilo principal de toda la aplicación, si detienes ese hilo con un Timer seguramente se va a detener toda la aplicación, por lo menos todo lo que esté corriendo sobre el EventDispatchThread. Y al finalizar la espera la tecla va a estar en la cola del teclado.

Normalmente, a mi conocimiento, se utiliza el intervalo de tiempo transcurrido para saber si se debe consumir el evento del teclado. Eso permite que otros eventos sigan ocurriendo, ya sea del teclado o de otro dispositivo.

Por ejemplo:

Código Java:
Ver original
  1. private long lasttimeout = System.currentTimeMillis();
  2.     private long timeout = 0;
  3.  
  4.     jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
  5.         @Override
  6.         public void keyTyped(java.awt.event.KeyEvent evt) {
  7.             if (System.currentTimeMillis() - lasttimeout < timeout * 10) {
  8.                 evt.consume();
  9.             } else {
  10.                 // doSomething()
  11.                 lasttimeout = System.currentTimeMillis();
  12.             }
  13.         }
  14.     });
Dependiendo del valor de la variable timeout, el tiempo en que se va a consumir un evento (y por consiguiente se va a dejar de procesar), va a ser mayor o menor. Si tuvieras un Slider podrías cambiar el valor para probar la diferencia. O puedes cambiar el valor de timeout manualmente antes de ejecutar la aplicación.
Código Java:
Ver original
  1. jSlider1.addChangeListener(new javax.swing.event.ChangeListener() {
  2.         @Override
  3.         public void stateChanged(javax.swing.event.ChangeEvent evt) {
  4.             if (evt.getSource() instanceof JSlider) {
  5.                 JSlider slider = ((JSlider) evt.getSource());
  6.                 if (!slider.getValueIsAdjusting()) {
  7.                     timeout = slider.getValue();
  8.                 }
  9.             }
  10.         }
  11.     });
Saludos,

ps:

En el caso del evento keyTyped solamente funciona con las teclas simples, es decir, el Alt+F4 va a seguir funcionando independientemente de la espera aunque tenga un timeout muy alto, para evitar eso tendrías que sobrecargar el método keyPressed también.