2010-08-25 11 views
5

Necesito poder detectar si se presiona cierta tecla (por ejemplo, CTRL) durante una operación específica de la mía. No tengo acceso a un oyente clave, ni a un evento de mouse. Lo que espero es que haya alguna clase que tenga un método como "boolean isKeyPressed (keycode)".Java: ¿podemos detectar si se presiona una tecla sin usar un Listener?

Hay alguien consciente de un método como este en java?

Para un poco de fondo, estoy tratando de anular el comportamiento de omisión de arrastrar & para un componente. Por defecto, de acuerdo con los javadocs para DropTargetDragEvent, si no se pulsa ninguna tecla modificadora, entonces el se ve en la lista de acciones apoyadas del componente para un movimiento, entonces una copia & continuación, un enlace y se detiene después de encontrar la primera.

En mi solicitud, apoyamos tanto en papel & enlace. Según el javadoc, sin presionar la tecla CTRL, la acción predeterminada es copiar. Queremos que el usuario pueda especificar la acción predeterminada (lo que le permite establecer su uso más común) y luego forzar una específica usando las teclas modificadoras.

Si puedo detectar el estado de pulsar la tecla, entonces puedo forzar que esto suceda, pero no puedo ver ninguna otra forma de cambiar la acción predeterminada.

Gracias de antemano, Brian

+5

¿Por qué no tiene acceso a un oyente? ¿No puedes crear el tuyo? ¿Qué marco de GUI estás usando? –

+0

Noel - parece mi comentario en contra de la publicación de Erick Robertson. – DaddyB

Respuesta

0

Incluso si hubiera un procedimiento de este tipo, ¿qué es lo que quiere hacer con ella? Llámalo en un ciclo sin fin con la esperanza de que vuelva cierto en algún momento? Creo que un mecanismo basado en eventos/oyente se adapta mucho mejor en este caso.

+1

no es un ciclo sin fin, no. simplemente llamado a demanda durante una determinada operación (devolución de llamada durante arrastrar y soltar). – DaddyB

5

El método MouseEvent.getModifiers() devolverá un mapa de bits de teclas modificadoras que se presionaron en el momento en que se generó MouseEvent. O bien, puede usar MouseEvent.isControlDown() para verificar específicamente la tecla CTRL.

+0

Estoy de acuerdo en que en un mundo ideal, un oyente clave probablemente sería el mejor. sin embargo, en mi opinión, hay algunos problemas con este enfoque para mi escenario: ¿A qué adjunto el oyente? mi aplicación es bastante compleja en términos de UI y también se puede personalizar a través de complementos. He visto adjuntar un Oyente al hilo del evento, pero esto termina procesando todos los eventos clave y puede tener implicaciones de rendimiento en otros lugares. del mismo modo, la extensibilidad de la aplicación significa que no necesariamente tengo una manera de detectar el inicio del arrastre y por lo tanto no puedo activar selectivamente el oyente en – DaddyB

+0

que acabo de reproducir con un detector de teclas y Resulta que los eventos clave no se disparan mientras se mantiene presionado un botón del mouse (y estoy trabajando con arrastrar y soltar aquí) y eso excluye a un oyente clave. Supongo que podría mirar a un oyente de ratón global y verificar el estado de los modificadores, pero esto parece excesivo para este problema. – DaddyB

+0

Actualicé mi respuesta: puede verificar que MouseEvent se genere cada vez que se mueve o se arrastra el mouse. –

0

Creo que va por el camino equivocado. Lo que quiere hacer es cambiar la acción cuando se inicia el arrastre, no cuando se suelta. Hay formas de cambiar la acción en la iniciación, que incluye interrogar las preferencias del usuario en el caso "sin modificadores". Es posible que cambiar la forma en que se llama DropTargetDragEvent.

+0

Acepto, pero no he podido descifrar cómo configurar el código "sin modificadores" en el código: los javadocs (ver enlace en mi publicación original) indican que la copia tiene prioridad sobre el enlace. Si tiene alguna sugerencia sobre cómo hacer esto, sería muy apreciado. – DaddyB

1

Esta es una manera posiblemente sucia de hacerlo. Pero esto le permite 'registrar' eventos clave y luego consultarlos.

//register this somewhere in the startup of your application 
KeyboardFocusManager mgr = KeyboardFocusManager.getCurrentKeyboardFocusManager(); 
    mgr.addKeyEventDispatcher(KeyEventRecorder.getInstance()); 

//then can query events later 
    KeyEvent keyEvt = KeyEventRecorder.getLastEvent(); 
    if(keyEvt != null && keyEvt.getKeyCode() == KeyEvent.VK_CONTROL && keyEvt.getID() == KeyEvent.KEY_PRESSED) 
     //do something.. 

    private class KeyEventRecorder implements KeyEventDispatcher 
    { 
     private static KeyEvent lastEvent; 
     private static KeyEventRecorder myInstance; 

     private KeyEventRecorder() 
     { 
      super(); 
     } 

     public static synchronized KeyEventRecorder getInstance() 
     { 
      if(myInstance == null) 
       myInstance = new KeyEventRecorder(); 
      return myInstance; 
     } 

     /** 
     * retrieve the last KeyEvent dispatched to this KeyEventDispatcher 
     */ 
     public static KeyEvent getLastEvent() 
     { 
      return lastEvent; 
     }//method 

     @Override 
     public boolean dispatchKeyEvent(KeyEvent e) 
     { 
      lastEvent = e; 
      //return false to let KeyboardFocusManager redistribute the event elsewhere 
      return false; 
     }//method 
    }//class 
Cuestiones relacionadas