java - Mac OS X Big Sur 上 webstart 的 JDialog 全屏问题
问题描述
Mac OS X 11 (Big Sur) 中新的“首选选项卡”系统设置会导致 Java 应用程序出现问题。如果设置设置为“始终”或“全屏”并且应用程序正在全屏运行,则 JDialogs 作为选项卡打开并且变得无响应。
有一种方法可以在每个应用程序的基础上设置“首选选项卡”设置。例如,运行
defaults write net.java.openjdk.cmd AppleWindowTabbingMode manual
in Terminal 确保 NetBeans(以及看似在 openjdk 上运行的任何应用程序)正常工作。
我们的应用程序仍然支持 Mac 上的 Webstart。上面的设置不影响Webstart,所以问题还是出现在那里。我不确定上述命令中的“net.java.openjdk.cmd”来自哪里,以及在哪里可以找到 Webstart 的等效值。它似乎不在 Info.plist 中。有谁知道 Webstart (build 1.8.0_271-b09) 的值应该是多少?一般来说,我怎样才能找到适合特定应用程序的值?
[编辑 2021 年 3 月 25 日] 为了尽量减少用户的负担,我的方法是使用我们软件中的“默认读取 X AppleWindowTabbingMode”读取当前设置。如果未设置为手动,软件会提供运行“默认写入 X AppleWindowTabbingMode 手动”并建议用户之后需要重新启动软件。
为了以编程方式获取捆绑 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 控制面板中启用它。
在控制台中,查找如下日志消息:
temp: bundleIdentifier is com.oracle.jnlp--<number>
显然,每次安装可能会有所不同:-(因此您仍然需要确切了解 java 是如何创建标识符的。
推荐阅读
- matplotlib - 在 matplotlib 中绘制三个等宽、居中的面板
- python - 如何将复选框值链接到模型的属性?
- kubernetes - Kubernetes pod 内存与 cgroup
- java - 为什么这个简单的删除方法在 springBoot 项目中不再起作用?
- haskell - Haskell 中是否有用于树木的标准地图功能?
- database - 在 oracle toad 中读取widememo值
- javascript - 如何在echarts条形图中使条形周围的空间可点击?
- python-3.x - 正则表达式多行 - Python3 - 匹配大括号内的所有内容
- artifactory - 如何调试工件缓慢?
- c# - C# & Siemens S7 与 Sharp7 库的通信 - GetAgBlockInfo 参数?