Comment détecter une pression sur une touche META pendant le glisser-déposer sur OSX

Il existe un bogue dans Java 6/7 sur OSX qui, lors des opérations de glisser-déposer, ignore la clé META (CMD). (La touche Ctrl fonctionne très bien sous Windows, la touche Ctrl est également ignorée sous OSX). J’ai VRAIMENT besoin que cela fonctionne.

Voir: Java Glisser-déposer sur les rapports OS X Déplacer au lieu de Copier

J’ai essayé d’append un écouteur KeyEventDispatcher au KeyboardFocusManager, mais ce n’est pas appelé lors d’une opération de glisser.

La méthode processKeyEvent () du parent JPanel n’est jamais invoquée non plus.

Alors, y a-t-il un endroit où je peux mettre un crochet pour détecter les appuis sur les touches META?

Sur DragGestureEvent, vous pouvez obtenir les modificateurs. e.getTriggerEvent().getModifiersEx() état des javadocs:

Les modificateurs étendus représentent l’état de toutes les clés modales, telles que ALT, CTRL, META et les boutons de la souris juste après l’événement.

Ce code a fonctionné pour moi sur OSX:

 public void dragGestureRecognized(DragGestureEvent e) { boolean isMetaDown = InputEvent.META_DOWN_MASK == (e.getTriggerEvent().getModifiersEx() & InputEvent.META_DOWN_MASK)); System.out.println("metaDown:"+isMetaDown); } 

Alors, avec quelques expériences, j’ai en quelque sorte trouvé une solution de contournement. Bien qu’aucun écouteur de la souris ne reçoive le modificateur de touche Commande ou Ctrl, la touche Ctrl affecte DropAction pour la plupart des classes DragNDrop.

Une chose que nous avons remarquée est que cela fonctionnerait SI vous appuyiez sur la touche de navigation APRÈS que vous ayez traîné quelque chose sur la cible de largage. Donc, pour fournir à l’utilisateur un plus grand retour, j’ai été en mesure de modifier DragSourceListener et DragSourceMotionListener pour mettre à jour (généralement) l’icône glisser. Ce n’est pas fiable sur le Mac, car ce dernier réinitialise fréquemment le curseur de glissement par défaut. Mais au moins, l’utilisateur PEUT effectuer une opération glisser-copier, de manière quelque peu non standard, avec un retour incohérent d’icons.