Mac OS X Big Sur 上 webstart 的 JDialog 全屏问题

问题描述

Mac OS X 11 (Big Sur) 中新的“Prefer Tabs”系统设置会导致 Java 应用程序出现问题。如果设置为“始终”或“全屏”且应用程序以全屏方式运行,则 JDialogs 作为选项卡打开并无响应。

有一种方法可以在每个应用程序的基础上设置“首选标签”设置。例如,运行

defaults write net.java.openjdk.cmd AppleWindowTabbingMode manual

在终端中确保 NetBeans(以及似乎在 openjdk 上运行的任何应用程序)正常工作。

我们的应用程序仍然支持 Mac 上的 Webstart。上面的设置不影响Webstart,所以问题还是出现在那里。我不确定上面命令中的“net.java.openjdk.cmd”来自哪里,以及在哪里可以找到 Webstart 的等效值。它似乎不在 Info.plist 中。有谁知道 Webstart (build 1.8.0_271-b09) 的值应该是多少?一般而言,如何为特定应用找到合适的值?

[编辑 2021 年 3 月 25 日] 为了尽量减少我们用户的负担,我的方法是使用我们软件中的“默认读取 X AppleWindowTabbingMode”读取当前设置。如果没有设置为手动,软件会提示运行“defaults write X AppleWindowTabbingMode manual”,并提示用户之后需要重启软件。

为了以编程方式获取包 ID,我尝试了:

URL u = Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().toURL();
URL canonicalHome = new URL(u.toString() + "jnlp");
appID = "com.oracle.jnlp-" + canonicalHome.hashCode();

但这似乎没有让我得到正确的价值。据我所知,webstart 实际上使用了一个叫做 JavaAppletPlugin 的东西,它使用了一个“java”可执行文件,而不是“javaws”。关于如何以编程方式获取正确值的任何想法?

解决方法

希望这对您仍然有用。

您需要的是应用程序的包标识符。 对于 openjdk,这是:

<dict>
    <key>CFBundleIdentifier</key>
    <string>net.java.openjdk.cmd</string>
...

我的猜测是 Webstart 应用程序正在使用来自 Oracle JVM 的 javaws。 在这种情况下,包标识符是一个串联(来自 java 源代码):

this.bundleIdentifier = "com.oracle.jnlp-" + paramLaunchDesc.getCanonicalHome().hashCode();

您应该尝试为您的应用创建一个快捷方式,其中应包含 plist 格式的捆绑信息。获取标识符。 然后您的终端命令将变为:

defaults write com.oracle.jnlp-<something> AppleWindowTabbingMode manual

更新

您或许可以使用 Java 控制台找到标识符。在 Java 控制面板中启用它,您可以通过系统偏好设置访问该面板。 Java Control Panel

在控制台中,查找如下日志消息:

temp: bundleIdentifier is com.oracle.jnlp--<number>

显然,它可能因每次安装而异:-( 所以你仍然需要确切地找出 java 如何创建标识符。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...