2016-07-27 29 views
8

OSX上的Java 6/7中存在一個錯誤,在拖放操作期間,它忽略了META(CMD)鍵。 (Ctrl鍵在Windows上工作得很好,Ctrl鍵也在OSX上忽略) 我真的需要這個工作。如何在OSX上拖放期間檢測META按鍵

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

我嘗試添加的KeyEventDispatcher監聽到的KeyboardFocusManager,但在拖動操作過程中不被調用。

也不會調用父JPanel的processKeyEvent()方法。

那麼,有沒有什麼地方可以掛鉤來檢測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中工作,不是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鍵影響許多DragNDrop類的DropAction。

我們注意到的一件事是,如果您在拖放目標上拖動某些東西之後按下了控制鍵,它將起作用。 因此,爲了向用戶提供更多的反饋,我能夠修改我的DragSourceListener和DragSourceMotionListener(通常)更新拖動圖標。它在Mac上不可靠,因爲Mac經常會將拖動光標重置爲默認值。 但是至少用戶可以通過不規範的圖標反饋以某種非標準的方式進行拖放複製操作。