2010-02-27 5 views
2

Lorsque je définis setAccelerator() sur Control + A ou Control + P et que j'exécute le programme, il ne détecte pas la séquence de touches.Java JMenu setAccelerator() problème

Voici le code:

menuItem = new JMenuItem("About"); 
    menuItem.setActionCommand("About"); 
    menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK)); 
    menuItem.setMnemonic(KeyEvent.VK_A); 
    menuItem.addActionListener(this); 
    menu.add(menuItem); 

Puis, quand il est pressé, il devrait appeler l'action Listener:

public void actionPerformed(ActionEvent e) { 

    if(e.getActionCommand().equals("About")) { 

    System.out.println("About"); 

    } 
} 

Je suis en train de courir dans Eclipse sur un Mac si cela importe.

Répondre

5

Control-A et Control-P sont les deux séquences de touches qui peuvent déjà être interceptées, en fonction de votre plate-forme et en fonction de ce qui a le focus sur le clavier. Control-A peut déjà être intercepté et interprété comme "select all", et Control-P peut déjà être intercepté et interprété comme "paste". Que se passe-t-il si vous sélectionnez une touche moins courante au lieu de "Control-A", par exemple "Control-Shift-A" ou "Control-B"? Voici une version modifiée de votre code qui utilise Control-Shift-A au lieu de contrôle-A:

menuItem = new JMenuItem("About"); 
menuItem.setActionCommand("About"); 
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK | Event.SHIFT_MASK)); 
menuItem.setMnemonic(KeyEvent.VK_A); 
menuItem.addActionListener(this); 
menu.add(menuItem); 

Je l'ai testé ce changement sur mon propre système en utilisant the JMenu demo from the Swing tutorial, et j'ai trouvé (exactement comme vous l'avez fait) que l'enregistrement de contrôle -A comme l'accélérateur n'a eu aucun effet. Cependant, l'enregistrement de Control-Shift-A comme accélérateur a parfaitement fonctionné.

-1

pas sûr si cela va aider, mais vous utilisez Event.CTRL_MASK au lieu de KeyEvent.CTRL_MASK