Ver Mensaje Individual
  #11 (permalink)  
Antiguo 04/03/2011, 21:12
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Evento de teclado en Panel

Hola,

Cita:
Iniciado por cribelo Ver Mensaje
... Ahora si podes me podes explicar mas o menos como funciona este codigo?...
Básicamente el sistema de eventos de Java funciona enviando mensajes entre clases, así que cuando presionas una tecla en el teclado se llaman a una serie de Listeners (que no son mas que clases con ciertas interfaces que permiten llamar a métodos específicos). Si observas detenidamente tiene la misma estructura que cuando asignas un Listener a un botón o similar.

Código Java:
Ver original
  1. java.awt.KeyboardFocusManager.
  2.                 getCurrentKeyboardFocusManager().
  3.                 addKeyEventDispatcher(aquí el que recibe el evento);
  4.  
  5.                 jButton1.addMouseListener(aquí el que recibe el evento);

La clase que implementa la inteface para 'recibir el evento' no es mas que java.awt.KeyEventDispatcher, y esta debe implementar el método dispatchEvent para poder manejar el evento, al igual que un KeyListener o MouseListener.

Código Java:
Ver original
  1. private java.awt.KeyEventDispatcher dispatcher;
  2.  
  3.         dispatcher = new java.awt.KeyEventDispatcher() {
  4.             @Override
  5.             public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) {
  6.                 // Aca se maneja el evento igual que cualquier otro KeyListener
  7.                 return false;
  8.             }
  9.         };
En el primer ejemplo use un delegado para poder llamar a los métodos del mismo, así no era necesario usar un método estático, sino llamar exactamente al mismo objeto (no es ni siquiera un clon, es el mismo) que llama el MouseListener, eliminando la necesidad de crear métodos estáticos.

Código Java:
Ver original
  1. delegate.mouseClicked(
  2.                             new java.awt.event.MouseEvent(jButton1,
  3.                             java.awt.event.MouseEvent.NOBUTTON,
  4.                             new java.util.Date().getTime(), 0, 0, 0, 1, false));
  5.                 }
Por último en el dispose, elimino el Listener, sino al presionar F5 en otra ventana u otro objeto generaría un error. El manejador del KeyboardFocusManager funciona a nivel de todo el sistema Swing o AWT, así que si presionas F5 en otra ventana aún funcionará correctamente (si quieres eliminar eso tendrías que usar un JDialog modal).

Código Java:
Ver original
  1. @Override
  2.     public void dispose() {
  3.         java.awt.KeyboardFocusManager.
  4.                 getCurrentKeyboardFocusManager().
  5.                 removeKeyEventDispatcher(dispatcher);
  6.         super.dispose();
  7.     }

Saludos,