2016-07-27 5 views
8

Ошибка в Java 6/7 на OSX, где во время операций перетаскивания он игнорирует ключ META (CMD). (Ctrl-клавиша отлично работает в Windows, клавиша Ctrl также игнорируется на OSX) Мне действительно нужно, чтобы это работало.Как обнаружить нажатие клавиши META во время перетаскивания на OSX

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

Я пытался добавить KeyEventDispatcher слушателя к KeyboardFocusManager, но это не вызывается во время операции перетаскивания.

Также не вызывается метод processKeyEvent() родительского JPanel.

Итак, есть ли место, где я могу поставить крючок для обнаружения нажатия клавиш META?

ответ

1

На DragGestureEvent вы можете получить модификаторы. e.getTriggerEvent().getModifiersEx() Javadocs состояние:

Расширенные модификаторы представляют состояние всех модальных ключей, такие как ALT, CTRL, META и кнопки мыши только после произошедшего события.

Этот код работает для меня на 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

Просто попробовал это. (помните, я работаю в Java 1.6, NOT 1.8) getModifiersEx() всегда возвращает 1040. BUTTON1_MASK | BUTTON1_DOWN_MASK Я попробовал Control, Option, Command. все ключи дали одинаковое значение. – CasaDelGato

+0

Извините, не видел 1.6 в своем посте. Теперь я делаю ссылку, указанную в другой проблеме. – Jayfray

+0

Да, я только что заметил, что неправильно напечатал версию в исходном вопросе. Должна быть Java 6/7, а не 7/8. – CasaDelGato

0

Так, с кучей экспериментов, у меня добрейшей найденного обходного пути. Хотя ни один из прослушивателей мыши не получает модификатор Command или Ctrl, клавиша Ctrl влияет на DropAction для многих классов DragNDrop.

Одна вещь, которую мы заметили, заключалась в том, что она будет работать, если вы нажали клавишу управления ПОСЛЕ того, как вы перетащили что-то поверх целевой цели. Чтобы предоставить пользователю большую обратную связь, я смог изменить свой DragSourceListener и DragSourceMotionListener для (обычно) обновления значка перетаскивания. Это ненадежно на mac, так как mac часто сбрасывает курсор перетаскивания на значение по умолчанию. Но, по крайней мере, пользователь может выполнить операцию Drag-Copy несколько нестандартным образом с непоследовательной обратной связью значков.