2010-03-10 7 views
6

Nel seguente programma, perché non colpire la una stampa chiave"ciao, mondo" mentre colpisce CTRL +un non lo fa?Java sequenze di tasti dell'oscillazione: come far funzionare CTRL-modificatore

import java.awt.event.*; 
import javax.swing.*; 

public class KeyStrokeTest { 
    public static void main(String[] args) { 
     JPanel panel = new JPanel(); 

     /* add a new action named "foo" to the panel's action map */ 
     panel.getActionMap().put("foo", new AbstractAction() { 
       public void actionPerformed(ActionEvent e) { 
        System.out.println("hello, world"); 
       } 
      }); 

     /* connect two keystrokes with the newly created "foo" action: 
      - a 
      - CTRL-a 
     */ 
     InputMap inputMap = panel.getInputMap(); 
     inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), 0), "foo"); 
     inputMap.put(KeyStroke.getKeyStroke(Character.valueOf('a'), InputEvent.CTRL_DOWN_MASK), "foo"); 

     /* display the panel in a frame */ 
     JFrame frame = new JFrame(); 
     frame.getContentPane().add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

Come potrei risolvere il problema che CTRL +un funziona così?

risposta

15

Trovo più facile da usare:

KeyStroke a = KeyStroke.getKeyStroke("A"); 
KeyStroke controlA = KeyStroke.getKeyStroke("control A"); 

o:

KeyStroke controlA = KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK); 
6

Amico, utilizzare questo

inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK), "foo"); 
+0

Amico, grazie! La tua soluzione funziona, tuttavia mi chiedo ancora perché il mio non ... – Thomas

+0

Interessante ho fatto il mio suggerimento prima di questo post, in più ti ho dato altre alternative che potresti essere in grado di utilizzare in diverse situazioni. Immagino che non andrò a tutti i guai la prossima volta. – camickr

+1

@Thomas: Non so se sono corretto, ma il motivo per cui il tuo codice potrebbe non aver funzionato perché nel primo caso ti riferivi a un semplice carattere 'a'. Where-in nel secondo caso si fa riferimento a una combinazione di chiavi che è un ASCII e un valore di scansione (tasto Ctrl). Sento che avrebbe dovuto essere associato agli eventi correttamente. – bragboy

-1

Sì, il codice di cui sopra funzionerà.

Grande foto - Ctrl + A e un vengono letti come sequenze di tasti differenti lo stesso come un e b sarebbe stato diverso.

+5

L'OP sa che "Ctrl-A" e "A" sono tasti diversi. – camickr