java - 使用较新版本的 Java,我的一些应用程序快捷方式被 MacOS 快捷方式覆盖

标签 java macos swing java-11

我的应用程序使用 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 中,Google 搜索确定这是标准的 Mac 快捷方式 - https://support.apple.com/en-us/HT201236

Command-1: View the items in the Finder window as icons.

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

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

Command-2: View the items in a Finder window as a list.

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 时,它会最小化窗口,但它也会运行自动更正,因此它会同时执行这两件事。

最佳答案

So my question is what is the correct mac behaviour, should my shortcut in my application override the MacOS shortcut or not, i.e is this a bug introduced in Java 11 or was the previous behaviour buggy and now fixed.

并不是说它有帮助,但是......我认为这个问题本身是有缺陷的,至少对于这个问题来说。

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

有一些系统范围(“macOS”)快捷方式,例如用于捕获屏幕图像(command-shift-3 等),或用于启动 Spotlight(命令空间)。但 command-1 不是其中之一,command-2 也不是。

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

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

一般性地回答最初的问题——与这个具体问题无关——如果没记错的话,macOS 快捷方式优先……但还有一种解决方法。 Apple > 系统偏好设置... > 键盘 > 快捷方式可让您更改现有的系统范围快捷方式(尽管通常我建议不要这样做),或者 - 更好的是 - 添加您认为应用程序应该的快捷方式有。

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

关于java - 使用较新版本的 Java,我的一些应用程序快捷方式被 MacOS 快捷方式覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62754705/

相关文章:

java - Android apache Poi ArrayAdapter

Java 连接到在线数据库

java - Java 中旅行商问题的最近邻启发式

c++ - 防止从不同进程打开文件两次

macos - OSX 上使用摄像头覆盖的 ffmpeg 屏幕录制

java - JTextPane 使用 JButton 在没有空间的情况下换行和展开长单词

java - 如何在 JTextArea 中打印符号、非字母数字字符

java - Lombok 对jdk.compiler内部软件包的访问与Java-16不兼容

c - 程序在 Linux 和 Windows 上挂起,似乎在 Mac 上运行

Java Tab 键顺序 : setFocusTraversalPolicy