【问题标题】:How to detect META key press during Drag and Drop on OSX如何在 OSX 上拖放期间检测 META 按键
【发布时间】: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 按键吗?

【问题讨论】:

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


    【解决方案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 经常将拖动光标重置为默认值。 但至少用户可以以某种非标准的方式进行拖放复制操作,但图标反馈不一致。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多