【问题标题】:With newer version of Java some of my applications shortcuts are being overridden by MacOS shortcuts使用较新版本的 Java,我的一些应用程序快捷方式被 MacOS 快捷方式覆盖
【发布时间】:2020-10-26 11:56:43
【问题描述】:

我的应用程序使用 Java 8,在 MacOS 上,许多操作都定义了可以正常工作的快捷方式,例如定义为使用 COMMAND-1 的快捷方式

public final class AutoCorrectAction
    extends CorrecterAction
{
    private static final String ACTION_NAME = "autocorrect";
    

    public AutoCorrectAction(final int paneIndex)
    {
        super(ACTION_NAME, TextLabel.MENU_AUTOCORRECT.getMsg(), paneIndex);
        if (paneIndex == TagDisplayer.INDEX_NONE)
        {
            putValue(ACCELERATOR_KEY,(KeyStroke.getKeyStroke(KeyEvent.VK_1,
                                          Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())));

        }
     
        this.putValue(Action.SMALL_ICON, JaikozIcon.LOCAL_AUTOCORRECT.getIconSmall());
        this.putValue(JaikozAction.LARGE_ICON, JaikozIcon.LOCAL_AUTOCORRECT.getIconLarge());
        this.putValue(Action.SHORT_DESCRIPTION,TextLabel.MENU_AUTOCORRECTTOOLTIP.getMsg());

    }

    public final void actionPerformed(final ActionEvent e)
    {
        start.logger.entering(this.getClass().getName(), JaikozLogFormatter.ACTION_PERFORMED);      
        this.performTask(new AutoCorrecter(start, isSelectedOnly(e), isUseRowSelection));
        start.logger.exiting(this.getClass().getName(), JaikozLogFormatter.ACTION_PERFORMED);
    }
}

我的最新版本的软件现在使用 Java 11,现在当我按下 COMMAND-1 时,它会最小化窗口并在 Finder 中显示,谷歌搜索确定这是标准的 mac 快捷方式 - https://support.apple.com/en-us/HT201236

Command-1:以图标形式查看 Finder 窗口中的项目。

所以我的问题是正确的 mac 行为是什么,我的应用程序中的快捷方式是否应该覆盖 MacOS 快捷方式,即这是 Java 11 中引入的错误,还是以前的行为有错误,现在已修复。

令人困惑的是,我还有一个使用 Command-2 以相同方式定义的操作,这也是标准的 MacOS 快捷方式

Command-2:以列表形式查看 Finder 窗口中的项目。

public final class CreateAcousticIdAction
    extends CorrecterAction
{
    private static final String ACTION_NAME = "createmusicipacousticid";


    public CreateAcousticIdAction(final int paneIndex)
    {
        super(CreateAcousticIdAction.ACTION_NAME, TextLabel.MENU_CREATE_MUSICIP_ACOUSTIC_ID.getMsg(), paneIndex);
        this.putValue(Action.SMALL_ICON, JaikozIcon.CREATE_MUSICIP_PUID.getIconSmall());
        this.putValue(JaikozAction.LARGE_ICON, JaikozIcon.CREATE_MUSICIP_PUID.getIconLarge());

        this.putValue(Action.SHORT_DESCRIPTION, TextLabel.MENU_CREATE_MUSICIP_ACOUSTIC_IDTOOLTIP.getMsg());
        putValue(ACCELERATOR_KEY,(KeyStroke.getKeyStroke(KeyEvent.VK_2,
                                          Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())));
    }

    public final void actionPerformed(final ActionEvent e)
    {
        this.performTask(new CreateAcoustId(start,  isSelectedOnly(e), isUseRowSelection), JaikozThreadGroup.THREAD_CREATE_ACOUSTICID);
    }
}

但我的快捷方式仍然有效,并且没有被 MacOS 快捷方式覆盖!

更新 我已按要求制作了电影 - http://www.jthink.net/jaikoz/scratch/cmd1issue.mov

我现在注意到的是,当我按下 Cmd-1 时,它会最小化窗口,但它也会运行自动更正,所以它会同时做这两件事。

【问题讨论】:

  • 你能做一个最小的可重现的例子吗?对我来说,Command+1 在 osx 上没有做任何事情,firefox 使用它来选择正在显示的选项卡。
  • 正如 matt 评论的那样,请制作一个最小的示例应用程序,显示至少 2 或 3 个被覆盖的快捷方式。
  • 我使用 CMD + 1 激活按钮没有问题,所以我无法重现您所看到的内容。在 os x 上使用 jdk 11 或 14。
  • 鉴于@matt 观察到 jdk11 或 14 没有问题,以及您原来的 cmd-1“最小化窗口并在 Finder 中显示”,您能否发布有关此行为的视频?如果是这样,请务必从 Apple 图标到菜单,同时捕捉视频中屏幕的左上角区域。
  • @Glenn,上传到服务器并添加了链接。

标签: java macos swing java-11


【解决方案1】:

所以我的问题是正确的 mac 行为是什么,我应该 我的应用程序中的快捷方式是否覆盖 MacOS 快捷方式,即 这是 Java 11 中引入的错误,或者是以前的行为错误 现在已修复。

并不是说它有帮助,但是……我认为这个问题本身是有缺陷的,至少在这个问题上是这样。

您的谷歌搜索是正确的,Finder 中的 command-1 将窗口的内容列为图标。但关键是 在 Finder 中。该行为不会影响其他应用程序;它特定于 Finder。换句话说,它是 Finder 快捷方式,而不是 macOS 快捷方式。

一些系统范围(“macOS”)的快捷方式,例如用于捕获屏幕图像(command-shift-3 等),或用于调出 Spotlight(command-space )。但是 command-1 不是其中之一,command-2 也不是。

因此,您最初的问题,即哪个快捷方式(应用程序或操作系统)应该覆盖另一个,对于 command-1 和 command-2 没有实际意义。

快速搜索没有发现 JDK11 LTR 的 Mac 特定发行说明,但我怀疑这个问题确实是 JDK9、10 或 11 中某些更改的一部分。我不知道如何解决这个问题,但如果你有特定于 Mac 的发行说明,它们可能会提供提示。

一般回答原始问题 - 与此特定问题无关 - 如果有记忆,macOS 快捷方式优先...但也有解决方法。 Apple > System Preferences... > Keyboard > Shortcuts 可让您更改现有的系统范围的快捷方式(尽管我通常建议不要这样做),或者 - 更好的是 - 添加一个您认为应用程序应该 em> 有。

最后一个问题是 (1) 它必须是一个可执行的应用程序(所以不是 .jar),并且 (2) 它必须是一个标准的 GUI 应用程序,其中所需的操作以菜单项的形式存在,而不是UNIX CLI 可执行文件。

【讨论】:

  • 在时间用完之前获得赏金作为最佳答案,我还没有解决,下周必须回到这个。
【解决方案2】:

发现问题,我没有意识到我也在使用 Command-1 来最大化应用程序中的窗口,删除此快捷方式解决了问题

【讨论】:

  • 很高兴你能解决这个问题,保罗!我认为您在大约 10 秒时达到了 cmd-1 。请注意,此时 Window 菜单标题会快速闪烁。这表示选择快捷方式的菜单。 (例如,如果您按 cmd-P 进行打印,“文件”菜单将短暂闪烁。)所以...如果我理解正确,这听起来像是“最大化窗口”——与 cmd-1 相关——已显示在窗口菜单下。
【解决方案3】:

免责声明:我没有太多使用 MacOS 或从 java 创建与非第三方应用程序交互的 OS 宏的经验(通常违背 java 的目标,即独立于平台)。

Answer: 宏层次结构通常由操作系统确定,并受 java 编译器/jvm 实现的影响。理想情况下,第三方和可能不受信任的 java 程序(通常是开发人员的情况)应该最后优先接收密钥宏,因此任何使用宏的程序都应该避免任何可能预先存在的宏或确保它们有更大的焦点而不是操作系统/其他程序,以确保它们收到之前的所有输入。

理论实现:我能想到的两种主要方法是创建一个配置文件/程序,以允许用户定义访问程序的关键宏(这使得无论操作系统如何都可以避免冲突) 或拥有一个唤醒宏,该宏不太可能由其他程序(mac equiv of ctr-shift-k)导致程序获得对操作系统的关注,然后程序可以调用任意数量的关键宏。

注意:关于它发生的原因,我猜想以前的 java 代码需要额外的权限才能运行(如果发现漏洞,这会更危险),因此作为副作用,它在其他方面被操作系统赋予了更高的优先级也。因此,当特权级别在修复后下降(使用 java 11 中的所有其他安全功能)时,它在密钥宏层次结构中的位置也会下降。

【讨论】:

  • @PaulTaylor 有兴趣了解您是否能够确定它,特别是考虑到 cmd-1 和 cmd-2 的处理方式似乎不同。一个长镜头要检查:您在应用程序中说 cmd-1 更改为 Finder 并在那里显示应用程序。我怀疑你在开始时双击 Finder 启动它(导致它变得突出显示),现在它只是“隐藏”应用程序,与 appname > Hide appname 相同。这种 cmd-1 行为是否发生在任何其他应用程序中? (隐藏通常是通过 cmd-H,显示在 appname 菜单中。)
  • @Glenn 所以它不会变成finder,它会最小化窗口,添加视频
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 2017-09-01
  • 2011-04-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
相关资源
最近更新 更多