Activation JPopupMenu au clavier
Bonjour à tous,
Je me suis rendu compte que dans la plupart des applications, les popup menus pouvaient s'activer au clavier par Shift+F10 ou encore par la touche spéciale à gauche de Ctrl (qui ne doit pas être présente sur tous les claviers).
Ce mécanisme n'est pas présent par défaut dans Java (comme peut l'être la touche Alt avec les menus), alors j'ai décidé de le faire moi-même. Cependant je ne suis pas très satisfait de ce que j'ai fait, je ne suis pas sûr que ce soit vraiment la bonne manière de procéder.
Voici ce que j'ai fait, dans une classe dérivée de JRootPane :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| InputMap inputMap = this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = this.getActionMap();
Action actionPopup = new AbstractAction()
{
private static final long serialVersionUID = 0L;
public void actionPerformed(ActionEvent event)
{
JComponent component = CGUtilities.getFocusOwner();
if (component == null) return;
PointerInfo pointer = MouseInfo.getPointerInfo();
Point compPosition = component.getLocationOnScreen();
Point mouseLocation = pointer.getLocation();
int x = mouseLocation.x - compPosition.x;
int y = mouseLocation.y - compPosition.y;
MouseEvent popupEvent1 = new MouseEvent(component, MouseEvent.MOUSE_PRESSED, 0, 0, x, y, 1, true);
MouseEvent popupEvent2 = new MouseEvent(component, MouseEvent.MOUSE_RELEASED, 0, 0, x, y, 1, true);
component.dispatchEvent(popupEvent1);
component.dispatchEvent(popupEvent2);
}
};
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_F10, KeyEvent.SHIFT_DOWN_MASK), "doShowPopup");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_CONTEXT_MENU, 0), "doShowPopup");
actionMap.put("doShowPopup", actionPopup); |
L'utilisation du dispatchEvent me gêne un peu, mais je n'ai pas trouvé d'autre moyen :roll:
Quelqu'un a une meilleure idée ? :mrgreen:
Merci.