如何在Java Swing应用程序中实现类似macOS Mojave风格的暗黑模式?

14

我想知道是否有一种方法可以在Java的Swing应用程序中获得macOS Mojave风格的Dark Mode?

我想在Java Swing应用程序的JFrame上获得macOS Mojave风格的Dark Mode。

请告诉我。

谢谢。

Asrar Bashir Sunge

3个回答

10
似乎官方解决方案是使用系统属性来获取暗色模式。根据JDK-8235363,从 JDK 14 及以后版本开始支持:

新增了一个系统属性:"apple.awt.application.appearance",用于设置整个 Java 应用程序的外观。

为了获得最佳用户体验,您应该始终使用 system 值,以匹配用户的首选设置:
-Dapple.awt.application.appearance=system

当然,要进行测试并确保您没有自定义颜色使文本或组件在这种配色方案下难以看见或看不清。


附注:如果您还在寻找与本地 macOS 暗模式匹配的 Swing Look and Feel,请查看VAqua。免责声明:我从未在实际应用程序中使用过它,但它看起来非常漂亮,并使用本地呈现,看起来就像真正的东西。


system 对我无效,但 NSAppearanceNameAquaNSAppearanceNameDarkAqua 有效。 - Indiana Kernick
@IndianaKernick 奇怪。对我来说一直都很好用。你用的是哪个Java版本?它为什么不工作(例如:异常?崩溃?没有效果?)? - Harald K
我正在使用Java 15和macOS 10.13.1。它没有产生影响(显示了浅色主题窗口)。我本来更喜欢system,但算了。对于我的目的,NSAppearanceNameDarkAqua也可以。 - Indiana Kernick
在撰写本文时(JDK 16.0.1、JDK 15.0.2),我无法让任何推荐的方法起作用(尝试过=system=NSAppearanceNameDarkAqua)。源代码在这里:https://gist.github.com/tresf/8d682cb4f0d56945c1c3132e9e7864c7。我是通过IntelliJ的JVM属性设置属性的。如果有影响,我正在使用Azul的构建在M1 Mac上进行测试。 - tresf
我认为这很重要。我只在Oracle构建上进行了测试。但它已经在OpenJDK中实现,所以它可能会起作用。我猜你得问Azul为什么不行。 - Harald K
1
在corretto 11.0.14.9.1上,使用System.setProperty("apple.awt.application.appearance", "system")似乎有效。至少对于暗色标题栏(启动时),如果没有特别自定义,则外观仍然是常规的Swing。此外,当系统UI更改时,LaF和系统栏也不会改变。它需要更多的参与,比如这个Darklaf,并且正确配置。 - bric3

6
要获得深色标题栏,请使用选项-NSRequiresAquaSystemAppearance False启动。例如:
java -jar myapp.jar -NSRequiresAquaSystemAppearance False
       #  ("false", "no" or "0" will also work)

注意:许多解决方案建议编辑Info.plist文件,但这些解决方案对我没有起作用。

警告:强制执行此操作可能会导致某些框架崩溃,请谨慎使用。

输入图像描述


1
由于这是作为程序参数传递的,可能需要忽略参数-NSRequiresAquaSystemAppearance及其相邻的值FalseNo0,不区分大小写。然后您可能会看到此系统日志2022-01-31 10:14:21.435 java[66993:2679574] NSRequiresAquaSystemAppearance=NO - bric3

2

3
这对某些情况很好,但它没有与macOS集成。标题栏保持在浅色模式下,并且应用程序在应该响应系统主题更改时卡在“深色模式”中。由于使用了Darcula控件,它也不再感觉像本地应用程序。 - Baptiste Candellier
1
@BaptisteCandellier 标题栏可以通过 https://dev59.com/XFMI5IYBdhLWcg3w1fL-#56487943 进行固定。 - tresf
有没有办法通过代码来修复它? - George Shalvashvili

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接