Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Problema con el KeyListener y KeyEventDispatcher [Resuelto]
romeroalexx Sin conexión
programador
**

Mensajes: 25
Registro en: Oct 2011
Reputación: 0
Mensaje: #1
Problema con el KeyListener y KeyEventDispatcher [Resuelto]
Buenas muchachos les queria compartir un codigo con el cual estuvimos peleando por un par de horas hasta que lo pudimos resolver..

Les cuento nosotros tenemos una Ventana en Java que contiene un BorderLayout con varios botonos Laterales y Un scrollPane en el centro de esa ventana. Este ScrollPane tiene dentro un pane que recibe los eventos del teclado para mover al caballero.

El problema es que al meter todo eso es la ventana por lo general, el focus que recibe los eventos del teclado se perdia, por lo cual los KeyListener no servian ya que el Pane que mueve el caballero no los obtenia.

Ahora la 1era SOLUCION:

Con la ayuda del profesor en dentro del panel usabamos la funcion KeyEventDispatcher para darle a ese panel en especifico el Keylistener.

Implementandolo de la siguiente manera en el constructor:

Código:
KeyboardFocusManager.getCurrentKeyboardFocusManager()
                .addKeyEventDispatcher(
                        keyEventDispatcher = new KeyEventDispatcher() {
                            public boolean dispatchKeyEvent(KeyEvent evt) {
                                switch (evt.getID()) {
                                case KeyEvent.KEY_PRESSED:
                                    // System.err.println("pressed: " +
                                    // evt.getKeyChar());
                                    // ----------------------------------------
                                    // MANEJAR EVENTO AQUÍ
                                    // ----------------------------------------
                                    checkColision();
                                    estadoPartida.getCaballero().keyPressed(evt);

                                    if (evt.getKeyCode() == KeyEvent.VK_SPACE) {
                                        estadoPartida.atacoCaballero();
                                    }
                                    // ----------------------------------------
                                    break;

                                case KeyEvent.KEY_RELEASED:
                                    // System.err.println("released: " +
                                    // evt.getKeyChar());
                                    // ----------------------------------------
                                    // MANEJAR EVENTO AQUÍ
                                    // ----------------------------------------
                                    checkColision();
                                    estadoPartida.getCaballero().keyReleased(evt);
                                    // ----------------------------------------
                                    break;

                                default:
                                    break;
                                }

                                return true;
                            }
                        });



Ahora esto nos generaba el 2 Problema.

Al hacer esto forzábamos al panel que queríamos que obtuviese los KeyListener, por lo tanto luego de entrar ahí y desplazarnos hacia otro panel que necesitaba los KeyEvent del teclado como el chat, ya no servia dado que los tenia la instancia del Panel que contiene al caballero

La SEGUNDA SOLUCIÓN:

Fue implementar el código anterior solo en una función que la llamábamos al instanciar solo ese Panel en que lo necesitabamos y otra que al hacer el repaint de la ventana para ir al Panel de mensajes, llamabamos a la funcion que los desabilita de la siguiente manera.

Código:
public void darDispach() {
        KeyboardFocusManager.getCurrentKeyboardFocusManager()
                .addKeyEventDispatcher(
                        keyEventDispatcher = new KeyEventDispatcher() {
                            public boolean dispatchKeyEvent(KeyEvent evt) {
                                switch (evt.getID()) {
                                case KeyEvent.KEY_PRESSED:
                                    // System.err.println("pressed: " +
                                    // evt.getKeyChar());
                                    // ----------------------------------------
                                    // MANEJAR EVENTO AQUÍ
                                    // ----------------------------------------
                                    checkColision();
                                    estadoPartida.getCaballero().keyPressed(evt);

                                    if (evt.getKeyCode() == KeyEvent.VK_SPACE) {
                                        estadoPartida.atacoCaballero();
                                    }
                                    // ----------------------------------------
                                    break;

                                case KeyEvent.KEY_RELEASED:
                                    // System.err.println("released: " +
                                    // evt.getKeyChar());
                                    // ----------------------------------------
                                    // MANEJAR EVENTO AQUÍ
                                    // ----------------------------------------
                                    checkColision();
                                    estadoPartida.getCaballero().keyReleased(evt);
                                    // ----------------------------------------
                                    break;

                                default:
                                    break;
                                }

                                return true;
                            }
                        });
    }

Esta es la funcion que forza al panel a tener el KeyListener.

Código:
public void dispose() {
        java.awt.KeyboardFocusManager.getCurrentKeyboardFocusManager()
                .removeKeyEventDispatcher(keyEventDispatcher);
    }

Y esta la que lo quita y vuelve a los Listener normal de JAVA


Y luego lo que se necesita es que se llame a esa funcion en el constructor del Panel que necesite los forzar los KeyListener, y cuando se repinte otro panel con el metodo que lo hagan desde que inicializen todos los paneles llamen a la funcion 'dispose()'

"Un buen programador es aquel que mira a ambos lados, antes de cruzar una carretera de un solo sentido!" - Doug Linder

[Imagen: kQX1t]
04-03-2012 06:44 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #2
RE: Problema con el KeyListener y KeyEventDispatcher [Resuelto]
Hola Alex,

Que bueno que lo resolvieron, gracias por compartir las solución.

Saludos

[Imagen: dmi-1.jpg]
05-03-2012 11:10 AM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)