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

Evento de teclado en Panel

Estas en el tema de Evento de teclado en Panel en el foro de Java en Foros del Web. Hola, tengo un Jframe, con un JPAnel y 3 botones Editar, Nuevo y Eliminar Lo que quiero es que al apretar en el teclado f5, ...
  #1 (permalink)  
Antiguo 28/02/2011, 08:42
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Evento de teclado en Panel

Hola, tengo un Jframe, con un JPAnel y 3 botones
Editar, Nuevo y Eliminar
Lo que quiero es que al apretar en el teclado f5, se abra el Jdialog para Nuevo.
En el JPane hago
this.addKeyListener(eventosBotonesListadoPersonas) ;
en este eventosBotonesListadoPersonas me fijo si la letra es f5 y abro el jdialog,
va abro, en relidad no toma el evento, osea estando el la ventana apreto f5 y no se ejecuta,
Saben porque es?
Grcias
  #2 (permalink)  
Antiguo 28/02/2011, 12:29
Avatar de sivadmp  
Fecha de Ingreso: febrero-2011
Ubicación: La Paz - Bolivia
Mensajes: 293
Antigüedad: 13 años, 2 meses
Puntos: 20
Respuesta: Evento de teclado en Panel

hola, para utilizar teclado para crear accesos directos tienes que hacer uso del metodo
setMnemonic

este metodo funciona en componentes button, menu. etc, no funciona en contenedores

un ejemplo

Código java:
Ver original
  1. JMenu m=new JMenu("Archivo");
  2. m.setMnemonic(KeyEvent.VK_A)

saludos
  #3 (permalink)  
Antiguo 28/02/2011, 21:14
Avatar de jcMouse  
Fecha de Ingreso: noviembre-2009
Ubicación: Bolivia
Mensajes: 116
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: Evento de teclado en Panel

porque no utilizas el evento KEYRELEASED

Código Javascript:
Ver original
  1. private void TU_JPANEL_KeyReleased(java.awt.event.KeyEvent evt) {                                  
  2.         if(evt.getKeyCode()==116){//si se presiona F5
  3.              //Mostrar_ventana
  4.         }
  5.  
  6.     }
__________________
Problem?
Estoy aquí
Foro Code Army
  #4 (permalink)  
Antiguo 28/02/2011, 22:05
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Evento de teclado en Panel

Hola,

¿Y como sabes que estás posicionado, con el foco, en la ventana realmente? El KeyListener se lo asignaste a la ventana, pero es seguro que el foco (focus) lo tiene algún botón todo el tiempo.

Posiblemente,

Código Java:
Ver original
  1. //
  2.     public JFrame() {
  3.         initComponents();
  4.         KeyboardFocusManager.getCurrentKeyboardFocusManager().
  5.                 addKeyEventDispatcher(new KeyEventDispatcher() {
  6.             @Override
  7.             public boolean dispatchKeyEvent(KeyEvent e) {
  8.                 if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
  9.                         e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
  10.                     System.out.println("F5");
  11.                 }
  12.                 return false;
  13.             }
  14.         });
  15.     }

Saludos,

ps:

Si se lo asignaste al panel, el panel tiene que tener el foco para que funcione el f5.
setFocusable.

Última edición por HackmanC; 28/02/2011 a las 22:13 Razón: ps
  #5 (permalink)  
Antiguo 03/03/2011, 11:45
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

Cita:
Iniciado por sivadmp Ver Mensaje
hola, para utilizar teclado para crear accesos directos tienes que hacer uso del metodo
setMnemonic

este metodo funciona en componentes button, menu. etc, no funciona en contenedores

un ejemplo

Código java:
Ver original
  1. JMenu m=new JMenu("Archivo");
  2. m.setMnemonic(KeyEvent.VK_A)

saludos
hola eso no me sirve, porq no es un evento de un menu, es un boton que esta en un JPanel, osea estando en el JPanel, en vez de clickear en el boton editar, apretar f5 o el + y que me habra lo q habre si clickeo Editar, a no ser que en ese Mnemoniac pueda setear que metodo ejecutar, grciasss
  #6 (permalink)  
Antiguo 03/03/2011, 12:05
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

Cita:
Iniciado por HackmanC Ver Mensaje
Hola,

¿Y como sabes que estás posicionado, con el foco, en la ventana realmente? El KeyListener se lo asignaste a la ventana, pero es seguro que el foco (focus) lo tiene algún botón todo el tiempo.

Posiblemente,

Código Java:
Ver original
  1. //
  2.     public JFrame() {
  3.         initComponents();
  4.         KeyboardFocusManager.getCurrentKeyboardFocusManager().
  5.                 addKeyEventDispatcher(new KeyEventDispatcher() {
  6.             @Override
  7.             public boolean dispatchKeyEvent(KeyEvent e) {
  8.                 if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
  9.                         e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
  10.                     System.out.println("F5");
  11.                 }
  12.                 return false;
  13.             }
  14.         });
  15.     }

Saludos,

ps:

Si se lo asignaste al panel, el panel tiene que tener el foco para que funcione el f5.
setFocusable.

Hola el codigo que me diste no puedo usarlo, lo que sucede es que yo en la clase EventosBotonesListadoPersona implements MouseListener
que se lo agrego al boton1.addMouseLitener(EventosBotonesListadoPerson a)

En el
public void mouseClicked(MouseEvent arg0) {
llamo a la funcion
verActualizarpersona();

pero en el codigo que vos me diste no puedo acceder al metodo del Listener del click, se entiende? Como hago?? Grciass
  #7 (permalink)  
Antiguo 03/03/2011, 19:57
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Evento de teclado en Panel

Hola,

Cita:
Iniciado por cribelo Ver Mensaje
... lo que sucede es que yo en la clase EventosBotonesListadoPersona implements MouseListener
que se lo agrego al boton1.addMouseLitener(EventosBotonesListadoPerson a)

En el
public void mouseClicked(MouseEvent arg0) {
llamo a la funcion
verActualizarpersona();

pero en el codigo que vos me diste no puedo acceder al metodo del Listener del click, se entiende? Como hago?? Grciass
¿Que tiene que ver un MouseListener con un KeyEvent y la tecla F5?
¿Porque no puedes llamar al método verActualizarpersona() directamente?

Posiblemente ...

Código Java:
Ver original
  1. package application;
  2.  
  3. public class Persona {
  4.  
  5.     public void verActualizarPersona() {
  6.         System.out.println("Abrir dialogo ...");
  7.     }
  8.  
  9. }

Código Java:
Ver original
  1. package application;
  2.  
  3. import java.awt.event.MouseEvent;
  4. import java.awt.event.MouseListener;
  5.  
  6. public class EventosBotonesListadoPersona implements MouseListener {
  7.  
  8.     @Override
  9.     public void mouseClicked(MouseEvent e) {
  10.         Persona p = new Persona();
  11.         p.verActualizarPersona();
  12.     }
  13.  
  14.     @Override
  15.     public void mousePressed(MouseEvent e) {
  16.     }
  17.     @Override
  18.     public void mouseReleased(MouseEvent e) {
  19.     }
  20.     @Override
  21.     public void mouseEntered(MouseEvent e) {
  22.     }
  23.     @Override
  24.     public void mouseExited(MouseEvent e) {
  25.     }
  26. }

Código Java:
Ver original
  1. package application;
  2.  
  3. public class JFrame extends javax.swing.JFrame {
  4.  
  5.     private EventosBotonesListadoPersona delegate;
  6.     private java.awt.KeyEventDispatcher dispatcher;
  7.  
  8.     private javax.swing.JButton jButton1;
  9.  
  10.     public JFrame() {
  11.         jButton1 = new javax.swing.JButton();
  12.         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
  13.         getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));
  14.         jButton1.setText("Actualizar");
  15.         getContentPane().add(jButton1);
  16.         pack();
  17.  
  18.         delegate =  new EventosBotonesListadoPersona();
  19.         jButton1.addMouseListener(delegate);
  20.  
  21.         dispatcher = new java.awt.KeyEventDispatcher() {
  22.             @Override
  23.             public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) {
  24.                 if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
  25.                         e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
  26.                     delegate.mouseClicked(
  27.                             new java.awt.event.MouseEvent(jButton1,
  28.                             java.awt.event.MouseEvent.NOBUTTON,
  29.                             new java.util.Date().getTime(), 0, 0, 0, 1, false));
  30.                 }
  31.                 return false;
  32.             }
  33.         };
  34.         java.awt.KeyboardFocusManager.
  35.                 getCurrentKeyboardFocusManager().
  36.                 addKeyEventDispatcher(dispatcher);
  37.     }
  38.  
  39.     @Override
  40.     public void dispose() {
  41.         java.awt.KeyboardFocusManager.
  42.                 getCurrentKeyboardFocusManager().
  43.                 removeKeyEventDispatcher(dispatcher);
  44.         super.dispose();
  45.     }
  46.  
  47. }

Código Java:
Ver original
  1. package application;
  2.  
  3. public class Main {
  4.  
  5.     public static void main(String[] args) {
  6.         java.awt.EventQueue.invokeLater(new Runnable() {
  7.             @Override
  8.             public void run() {
  9.                 new JFrame().setVisible(true);
  10.             }
  11.         });
  12.     }
  13.  
  14. }

¿Cual es el problema?
¿Se entiende?

Saludos,
  #8 (permalink)  
Antiguo 03/03/2011, 20:02
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Evento de teclado en Panel

Hola,

Y en otro caso, suponiendo que la clase fuera privada y el método privado del JFrame,

Código Java:
Ver original
  1. package application;
  2.  
  3. import java.awt.event.MouseEvent;
  4. import java.awt.event.MouseListener;
  5.  
  6. public class JFrame extends javax.swing.JFrame {
  7.  
  8.     private EventosBotonesListadoPersona delegate;
  9.     private java.awt.KeyEventDispatcher dispatcher;
  10.  
  11.     private javax.swing.JButton jButton1;
  12.  
  13.     public JFrame() {
  14.         jButton1 = new javax.swing.JButton();
  15.         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
  16.         getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));
  17.         jButton1.setText("Actualizar");
  18.         getContentPane().add(jButton1);
  19.         pack();
  20.  
  21.         delegate =  new EventosBotonesListadoPersona();
  22.         dispatcher = new java.awt.KeyEventDispatcher() {
  23.             @Override
  24.             public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) {
  25.                 if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
  26.                         e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
  27.                     delegate.mouseClicked(
  28.                             new java.awt.event.MouseEvent(jButton1,
  29.                             java.awt.event.MouseEvent.NOBUTTON,
  30.                             new java.util.Date().getTime(), 0, 0, 0, 1, false));
  31.                 }
  32.                 return false;
  33.             }
  34.         };
  35.         java.awt.KeyboardFocusManager.
  36.                 getCurrentKeyboardFocusManager().
  37.                 addKeyEventDispatcher(dispatcher);
  38.         jButton1.addMouseListener(delegate);
  39.     }
  40.  
  41.     @Override
  42.     public void dispose() {
  43.         java.awt.KeyboardFocusManager.
  44.                 getCurrentKeyboardFocusManager().
  45.                 removeKeyEventDispatcher(dispatcher);
  46.         super.dispose();
  47.     }
  48.  
  49.     private void verActualizarPersona() {
  50.         System.out.println("Abrir dialogo ...");
  51.     }
  52.  
  53.     private class EventosBotonesListadoPersona implements MouseListener {
  54.  
  55.         @Override
  56.         public void mouseClicked(MouseEvent e) {
  57.             verActualizarPersona();
  58.         }
  59.  
  60.         @Override
  61.         public void mousePressed(MouseEvent e) {
  62.         }
  63.  
  64.         @Override
  65.         public void mouseReleased(MouseEvent e) {
  66.         }
  67.  
  68.         @Override
  69.         public void mouseEntered(MouseEvent e) {
  70.         }
  71.  
  72.         @Override
  73.         public void mouseExited(MouseEvent e) {
  74.         }
  75.     }
  76.  
  77. }

Realmente no miro cual es el problema según la descripción que diste. Al presionar la tecla F5, en cualquier lugar de toda la aplicación, se llama al método verActualizarPersona.

Y si lo quieres simplificar más, cambia esta parte del código:

Código Java:
Ver original
  1. public boolean dispatchKeyEvent(java.awt.event.KeyEvent e) {
  2.                 if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
  3.                         e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
  4.                     verActualizarPersona(); // Llamada al método directamente.
  5.                 }
  6.                 return false;
  7.             }
  8.         };
Saludos,
  #9 (permalink)  
Antiguo 04/03/2011, 05:38
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

Creo que el mal entendido es que mi metodo verActualizarpersona()
esta dentro de la clase EventosBotonesListadoPersona
este metodo lo que hace es abrir un JFrame con el formulario para modificar una persona (que es la que esta seleciconada en el JTable)
El tema que como vos lo planteas, yo no puedo llamar al metodo verActualizarpersona(), ya que este está dentro de esa clase, o este metodo no deberia estar ahi?
No se si me entendes, en el JFrame principal, no puedo poner
KeyboardFocusManager.getCurrentKeyboardFocusManage r().
addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
System.out.println("F5");
}


ya que todavia no instancie la clase EventosBotonesListadoPersona, esta la instancio cuando creo el JPanel de el alta y modif de personas
Graciasssss
  #10 (permalink)  
Antiguo 04/03/2011, 05:57
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

Joya ahi lo solucione
KeyboardFocusManager.getCurrentKeyboardFocusManage r().
addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
if (e.getID() == java.awt.event.KeyEvent.KEY_RELEASED &&
e.getKeyCode() == java.awt.event.KeyEvent.VK_F5) {
eventosBotonesListadoPersona.verActualizarPersona( );
}
return false;
}
});


con esta linea eventosBotonesListadoPersona.verActualizarPersona( );
este codigo lo pongo en el JPanelListadoPersona, una vez que ya haya instanciado eventosBotonesListadoPersona
Ahora si podes me podes explicar mas o menos como funciona este codigo?
KeyboardFocusManager es una clase, con un metodo de clase que puedo tomar una instancia del teclado actual
getCurrentKeyboardFocusManager()

a este le agrego
addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {

Eso no entiendo que hace el dispatcher, como funciona
Graciasssss
  #11 (permalink)  
Antiguo 04/03/2011, 21:12
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 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,
  #12 (permalink)  
Antiguo 16/03/2011, 06:22
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

Hola, mil gracias, pude hacerlo como me enseñaste, ahora tengo un problema
sabes como puedo hacer para en la linea
removeKeyEventDispatcher(dispatcher);
remover, pero no la instancia dispatcher, sino todos KeyEventDispatcher que tenga,
no se algún removeALLKeyEventDispatcher o algo por el estilo.
Gracias!!
  #13 (permalink)  
Antiguo 16/03/2011, 11:43
Usuario no validado
 
Fecha de Ingreso: agosto-2007
Mensajes: 141
Antigüedad: 16 años, 7 meses
Puntos: 1
Respuesta: Evento de teclado en Panel

lo solucione asi
java.awt.KeyboardFocusManager.setCurrentKeyboardFo cusManager(null);

Etiquetas: panel, teclado, eventos
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 21:05.