2016-07-27 40 views
8

W środowisku Java 6/7 na systemie OSX występuje błąd, w którym podczas operacji przeciągania i upuszczania ignorowany jest klucz META (CMD). (Klawisz Ctrl działa dobrze w systemie Windows, klawisz Ctrl jest również ignorowany na OSX). NAPRAWDĘ potrzebuję tego działa.Jak wykrywać naciśnięcie klawisza META podczas przeciągania i upuszczania na OSX

Patrz: Java Drag and drop on OS X reports Move instead of Copy

Próbowałem dodanie KeyEventDispatcher słuchacza do KeyboardFocusManager, ale to nie jest wywoływana podczas operacji przeciągania.

Nie można również wywołać metody processKeyEvent() rodzica JPanel.

Czy jest jakieś miejsce, w którym mogę umieścić hak, aby wykryć naciśnięcia klawiszy META?

Odpowiedz

1

W DragGestureEvent można uzyskać modyfikatory. stan e.getTriggerEvent().getModifiersEx() Javadocs:

Rozszerzone modyfikatory przedstawiają stan wszystkich modalnych klawiszy, takich jak ALT, CTRL, meta, a przyciski myszy tuż po zajściu zdarzenia.

Ten kod pracował dla mnie na OSX:

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

Próbowałem tego. (pamiętaj, pracuję w Java 1.6, NOT 1.8) getModifiersEx() zawsze zwraca 1040. BUTTON1_MASK | BUTTON1_DOWN_MASK Próbowałem Control, Option, Command. wszystkie klucze dały tę samą wartość. – CasaDelGato

+0

Niestety nie widziałem 1.6 w Twoim wpisie. Robię to teraz w linku podanym w innym wydaniu. – Jayfray

+0

tak, właśnie zauważyłem, że źle wpisałem wersję oryginalnego pytania. Powinny być Java 6/7, a nie 7/8. – CasaDelGato

0

Tak, z bandą eksperymentowania, mam na rodzaj znaleźli obejście. Podczas gdy żaden ze słuchaczy myszy nie otrzymuje modyfikatora klawisza Command lub Ctrl, klawisz Ctrl wpływa na DropAction dla wielu klas DragNDrop.

Jedną z rzeczy, które zauważyliśmy było to, że zadziała, JEŚLI naciśniesz klawisz kontrolny PO poślizgnięciu czegoś nad celem upuszczenia. Aby zapewnić użytkownikowi więcej informacji zwrotnych, udało mi się zmodyfikować DragSourceListener, a DragSourceMotionListener (zazwyczaj) zaktualizować ikonę przeciągania. Jest niewiarygodny na Macu, ponieważ Mac często resetuje kursor przeciągania do domyślnego. Ale przynajmniej użytkownik może wykonać operację przeciągania i kopiowania, w dość niestandardowy sposób, z niespójną informacją o ikonach.