如何在OSX上拖放期间检测META键按下

时间:2016-07-27 19:52:20

标签: java macos swing drag-and-drop keyevent

OSX上的Java 6/7中存在一个错误,在拖放操作期间,它忽略了META(CMD)密钥。 (Ctrl键在Windows上运行正常,在OSX上也忽略Ctrl键) 我真的需要这个工作。

请参阅:Java Drag and drop on OS X reports Move instead of Copy

我尝试将KeyEventDispatcher侦听器添加到KeyboardFocusManager,但在Drag操作期间不会调用它。

也不会调用父JPanel的processKeyEvent()方法。

那么,有什么地方可以放钩来检测META按键吗?

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

所以,通过一系列实验,我找到了一种解决方法。 虽然没有鼠标侦听器接收到Command或Ctrl键修饰符,但Ctrl键会影响许多DragNDrop类的DropAction。

我们注意到的一件事是,如果您在放下目标上拖动某些东西后按下控制键,它会起作用。 因此,为了向用户提供更多反馈,我能够修改我的DragSourceListener,并且DragSourceMotionListener(通常)更新拖动图标。它在mac上不可靠,因为mac经常将拖动光标重置为默认值。 但至少用户可以用一种非标准的方式进行拖拽复制操作,图标反馈不一致。