如何在 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 按键的主要内容,如果未能解决你的问题,请参考以下文章
如何在listview - WPF MVVM上拖放后更新codeBehind中的ObservableCollection