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

Posted

技术标签:

【中文标题】如何在 OSX 上拖放期间检测 META 按键【英文标题】:How to detect META key press during Drag and Drop on OSX 【发布时间】:2016-12-01 23:57:34 【问题描述】:

在 OSX 上的 Java 6/7 中存在一个错误,即在拖放操作期间,它会忽略 META (CMD) 键。 (Ctrl 键在 Windows 上工作得很好,Ctrl 键在 OSX 上也被忽略) 我真的需要让这个工作。

见: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);

【讨论】:

刚试过这个。 (记住,我使用的是 Java 1.6,而不是 1.8)getModifiersEx() 总是返回 1040。 BUTTON1_MASK | BUTTON1_DOWN_MASK 我试过控制、选项、命令。所有键都给出了相同的值。 很抱歉没有在您的帖子中看到 1.6。我现在在你提供给其他问题的链接中做。 是的,我只是注意到我在原始问题中输入了错误的版本。应该是 Java 6/7,而不是 7/8。 我知道如何做到这一点的唯一其他方法是将 KeyEventDispatcher 添加到 KeyboardFocusManager 但看起来您已经尝试过了。虽然这只有在你的 java 应用程序有焦点时才有效。如果操作系统具有焦点,则不会调度关键事件。也许您可以尝试在拖动过程中请求焦点,看看这是否对在拖动过程中获取关键事件有影响【参考方案2】:

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

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

【讨论】:

以上是关于如何在 OSX 上拖放期间检测 META 按键的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OS X 上拖放到 (python) 脚本上?

如何在图像上拖放绘制的多边形

如何在散点图上拖放

解释如何在 GTK+3.0 上拖放

如何在 Objective-C 中的地图上拖放和拖动图钉

如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection