Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用较新版本的Java,我的一些应用程序快捷方式被MacOS快捷方式覆盖_Java_Macos_Swing_Java 11 - Fatal编程技术网

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

使用较新版本的Java,我的一些应用程序快捷方式被MacOS快捷方式覆盖,java,macos,swing,java-11,Java,Macos,Swing,Java 11,我的应用程序使用了Java8,在MacOS上,许多操作都定义了快捷方式,可以正常工作,比如这个定义为使用COMMAND-1的快捷方式 public final class AutoCorrectAction extends CorrecterAction { private static final String ACTION_NAME = "autocorrect"; public AutoCorrectAction(final int

我的应用程序使用了Java8,在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快捷方式-

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

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

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

命令2:在查找器窗口中以列表形式查看项目

但我的快捷方式仍然有效,不会被MacOS快捷方式覆盖

更新 我已按要求制作了电影-

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

所以我的问题是什么是正确的mac行为,我的 我的应用程序中的快捷方式是否覆盖MacOS快捷方式,即 这是Java11中引入的bug,或者是以前的行为bug 现在修好了

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

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

有一些系统范围(“macOS”)的快捷方式,如用于捕捉屏幕图像(command-shift-3等),或用于打开聚光灯(命令空间)。但command-1和command-2都不是其中之一

因此,对于command-1和command-2,您最初的问题是哪个快捷方式(应用程序或操作系统)应该优先于其他快捷方式

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

一般来说,要回答最初的问题——与这个具体问题无关——如果内存可用,macOS快捷方式优先……但也有一种解决方法。苹果>系统首选项…>键盘>快捷键允许您更改现有的系统范围的快捷键(尽管我通常不建议这样做),或者——更好的是——添加一个您认为应用程序应该具有的快捷键


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

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

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

理论实现:我能想到的实现这一点的两种主要方法是创建一个配置文件/程序,允许用户定义访问该程序的关键宏(这使得无论操作系统如何都可以避免冲突),或者创建一个其他程序不太可能使用的唤醒宏(mac等效于ctr-shift-k)这会使程序在操作系统上获得焦点,然后程序可以调用任意多个关键宏


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

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

你能做一个最小的可复制的例子吗?对于我来说,Command+1在osx上没有任何作用,firefox使用它来选择t但显示的是哪个选项卡。正如matt所评论的,请制作一个极小的示例应用程序,显示至少2或3个您覆盖的快捷方式。我使用CMD+1激活按钮没有问题,因此我无法复制您看到的内容。在os x中使用jdk 11或14。给出@matt关于jdk11或14没有问题的观察结果,以及您的original认为cmd-1“最小化窗口并在Finder中显示”,你能发布关于这种行为的视频吗?如果是这样,请务必在视频中通过菜单从苹果图标捕获屏幕左上角。@Glenn,上传到服务器并添加了链接。在时间结束之前,我获得了悬赏作为最佳答案,我还没有解决问题,下周将不得不返回到这个问题。@PaulTaylor有兴趣听到你是否能够确定它,特别是考虑到cmd-1和cmd-2的处理方式似乎不同。有一个很难检查的问题:你说应用程序中的cmd-1更改为Finder并在那里显示应用程序。我怀疑你在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);
    }
}