java - Java 8 应用程序无法在 MacOS Catalina 10.15 上的暗模式下正常工作
问题描述
如果用户将System Preferences:General:Appearance切换为Dark我的应用程序的主屏幕(一个 JFrame)来自
到
很明显,Java 认识到选择了深色模式,但并没有很好地进行相应的调整。最紧迫的问题是文本颜色需要从黑色变为白色,但还有其他问题。
我正在使用最新版本的 Java 8 (jdk1.8.0_231.jdk),还不能迁移到 Java 13,但从发行说明中听起来他们仍然存在暗模式问题。
有没有固定的方法来解决这个我不确定最好的方法。
另外值得注意的是其他页面的子类 JDialog 不会变为黑色(除了菜单栏,因此仍然可读但看起来不合适)
例如来自
到
从 UIDefaults 开始
public static boolean isDarkModeEnabled()
{
try
{
// check for exit status only. Once there are more modes than "dark" and "default", we might need to analyze string contents..
final Process proc = Runtime.getRuntime().exec(new String[]{"defaults", "read", "-g", "AppleInterfaceStyle"});
proc.waitFor(100, TimeUnit.MILLISECONDS);
boolean result = proc.exitValue() == 0;
MainWindow.logger.severe("Is Dark Mode:" + result);
return result;
}
catch (IOException | InterruptedException | IllegalThreadStateException ex)
{
// IllegalThreadStateException thrown by proc.exitValue(), if process didn't terminate
MainWindow.logger.severe("Unable to determine dark mode");
return false;
}
public static void displayAsDarkMode()
{
Color whitish = new Color(250,250, 250);
Color fadedWhite = new Color(200,200, 200);
Color lightGray = new Color(49,52, 56);
Color darkGray = new Color(30,34,38);
UIManager.put("Label.foreground", whitish);
UIManager.put("Panel.background", lightGray);
UIManager.put("CheckBox.textForeground", whitish);
UIManager.put("CheckBox.foreground", whitish);
UIManager.put("TextField.background", darkGray);
UIManager.put("TextField.foreground", whitish);
UIManager.put("ComboBox.foreground", darkGray);
UIManager.put("ComboBox.textForeground", whitish);
UIManager.put("Button.background", lightGray);
UIManager.put("Button.textForeground", fadedWhite);
UIManager.put("List.background", darkGray);
UIManager.put("List.foreground", whitish);
UIManager.put("TextArea.background", darkGray);
UIManager.put("TextArea.inactiveBackground", darkGray);
UIManager.put("Table.background", darkGray);
UIManager.put("Table.gridColor", lightGray);
}
但我知道我不是第一个遇到这个问题的人
解决方案
看起来 Sun 正在为此努力,可能已经为 Java 14 做好了准备,但目前无法正常工作。
https://bugs.openjdk.java.net/browse/JDK-8231438
我通过设置 UIManager 颜色取得了一些成功,但问题仍然存在,例如如果使用 Aqua L&F,似乎无法将 ComboBox 或 Button 的颜色从白色更改
还有其他用户制造的 L&Feels,例如Darcula和VAqua,但这些都带来了自己的问题。
因此,在 Oracle 正确解决问题之前,我可能会使用我的部分 UIManager 方法。
推荐阅读
- elasticsearch - 在 Kibana 中升级 Xpack 许可证
- shellexecute - 使用 Shellexecute 在后台静默打开应用程序
- java - 需要一些关于 requireNonNull 的说明
- react-native - 即使 props 有索引,也无法访问 props.index
- javascript - 如何删除位于圆圈边界之外的标记?
- tfs - TFS 无法识别导入的数据库
- spring - 在 Twitter 克隆应用程序中关注用户的 Spring Rest Api 设计?
- typescript - 为什么 TypeScript 有一个结构化的类型系统?
- java - 如何在 e clipse 中配置生成的 Sources
- algorithm - 如何识别一些二叉搜索树的遍历属于后序还是中序?