¿Cómo puedo escuchar cuando se presiona una tecla (en Java Swing) a través de todos los componentes?

Me gustaría escuchar para combinaciones de teclas como Control+S sin la adición de la clave a los oyentes a cada componente en mi Swing de la aplicación. ¿Cómo puedo lograr esto?

InformationsquelleAutor diolemo | 2011-03-17

3 Kommentare

  1. 56

    Es posible.

    KeyboardFocusManager.getCurrentKeyboardFocusManager()
      .addKeyEventDispatcher(new KeyEventDispatcher() {
          @Override
          public boolean dispatchKeyEvent(KeyEvent e) {
            System.out.println("Got key event!");
            return false;
          }
    });

    Que va a agarrar todos los eventos clave. Devolviendo false permite que el foco del teclado manager para volver a la normalidad de los eventos clave del envío a los distintos componentes.

    Si quieres coger combinaciones de teclas, usted puede mantener un conjunto de «teclas pulsadas.» Cada vez que se pulsa una tecla, se debe agregar a la serie y comprobar cuáles son las teclas que ya están en el conjunto. Cuando se suelta una tecla, retírelo del conjunto.

    • Creo que freshwire es todavía va a tener que poner a los oyentes en cada uno de los componentes, aunque. Entonces, como el KeyEventDispatcher envía eventos, los componentes pueden escuchar ciertos acontecimientos y sus componentes específicos de la acción. Esto realmente suena como que va a ser un trabajo extra.
    • él sólo quiere atrapar a un mundial ctr+s… Esto va a funcionar bien.
    • Bueno, estoy de acuerdo. Yo estaba asumiendo freshwire sería entonces quiere empujar los eventos a nivel de los componentes, pero supongo que no es necesariamente el caso.
    • KeyboardFocusManager de hecho agarra todos los eventos clave, mientras que AWTEventListener no reacciona en todos los eventos. Si usted necesita escuchar zu evento clave como F11 para toggel a pantalla completa, KeyboardFocusManager es definitivamente mejor. AWTEventListener parece que sólo escuche zu eventos del Componente. Pero cuando no hay ningún componente tiene el foco, AWTEventListener no recibir notificaciones de los eventos clave.
    • Este código devuelve todos los eventos de cada pulsación de tecla es decir, para pulsar una tecla, un KEY_PRESSED, KEY_RELEASED y un KEY_TYPED evento ocurra. Para filtrar aún más para darle a un evento, es posible añadir código si (KeyEvent.KEY_PRESSED == e.getID()) { … } filtrar por KEY_PRESSED eventos, por ejemplo.
    • Me sale el mismo comportamiento de KeyboardFocusManager, si no hay ningún componente tiene el foco, no hay eventos serán entregados.

  2. 0

    No creo que hay una manera de agregar un «global» clave oyente como usted quiera hacer. Este post del foro con una pregunta similar, de espaldas a mí. Sólo se va a tener que agregar a cada componente. Esto sólo debería ser necesario hacer una vez, así que supongo que se puede conseguir con ella y seguir adelante.

    • yo no creo que hay una forma de agregar un «global» clave oyente como que están queriendo hacer Es sólo mal Toolkit.addAWTEventListener y se puede escuchar nada, además de que mencionó usted puede agregar eventos a addKeyEventDispatcher y usted puede agregar accel claves y así sucesivamente
    • Creo que no entendieron bien. No estoy hablando sobre el tipo de eventos que está siendo escuchado, pero el componente(s) sobre las que la escucha de obras.
    • después de conseguir el evento global, conseguir el centrado de componentes?
  3. 0

    Muy simple, mi amigo:
    Todo lo que tienes que hacer es crear un
    clase KeyEventDispatcher y registrarse para KeyboardFocusManager C. 1

    A continuación, analizar y extraer estado y la tecla info ver: C. 2
    Curiosamente, sin embargo, usted tiene que obtener la CLAVE del ESTADO a través de ThatEvent.getID();

    PARECE UN MISSNOMER A MÍ.

    ///////////////////////////////////////////////////////////////////////////////////////////  C.1)
             KeyDispatcher        ThisKeyDispatcher  = new KeyDispatcher();
    
             KeyboardFocusManager ThisKbFocusMngr = KeyboardFocusManager 
                                                  . getCurrentKeyboardFocusManager();
    
             ThisKbFocusMngr                      . addKeyEventDispatcher(ThisKeyDispatcher);
             return ThisKeyDispatcher;
    
    ///////////////////////////////////////////////////////////////////////////////////////////  
    C.2
    public static class KeyDispatcher implements KeyEventDispatcher {
    
      public boolean dispatchKeyEvent(final KeyEvent ThatEvent) {
    
         KeyboardFocusManager ThisKbFocusMngr    = null;
         Component            ThisComponent      = null;
         Container            ThisRoot           = null;
         Window               ThisWindow         = null;
         int                  ThisKeyStateEvent  = 0;
    
         try {
            ThisKbFocusMngr       = KeyboardFocusManager  . getCurrentKeyboardFocusManager();
            ThisComponent         = ThisKbFocusMngr       . getFocusOwner();
            ThisRoot              = ThisKbFocusMngr       . getCurrentFocusCycleRoot();
            ThisWindow            = ThisKbFocusMngr       . getActiveWindow();
            ThisKeyStateEvent     = ThatEvent.getID();   //i.e.  KeyEvent.KEY_RELEASED
    
            if(false                           == ThatEvent.isConsumed()) {
               boolean       RetBool          = false;
               if((KeyEvent.VK_BACK           == ThatEvent.getKeyCode())) {
                  RetBool                      = true;
               } else {
                  RetBool                      = m_CallSomeoneEvent(ThatEvent);
               }
               if(RetBool) {
                  ThatEvent.consume();
                  return true;
               }
            }
         }
         catch( Throwable e ) {
            LogThis(". ", e);
         }
         return false;
      }
    }
    • Gracias por la respuesta, pero ya he aceptado una respuesta hace más de un año. ¿Cómo es tu respuesta difieren de los aceptados respuesta? Tiene un montón de código extra que parece no tener fin en el contexto de mi pregunta.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea