如何在Windows / Linux上设置Java Swing应用程序的DPI?

2022-08-31 13:12:31

如果你有一台DPI超过150的显示器(比如Macbook Pro),你也可能会发现问题:Java Swing app上的字体对于高DPI显示器来说太小了,我根本无法改变字体大小(它直接忽略Windows DPI,只显示非常原始的DPI-->96)。除了改变屏幕分辨率之外,我什么也做不了,这绝对会使LCD上的所有内容都变得模糊。

是的,我有一台具有高DPI显示器的笔记本电脑,分辨率为15.6',分辨率为1920x1080,一些Java桌面应用程序在我的笔记本电脑上看起来非常小,例如Matlab,Burpsuite等。我已经在互联网上搜索了很长一段时间,但仍然找不到解决问题的方法。我知道我可以通过 更改 JRE 字体,但我找不到任何位置来设置 Java 桌面字体的默认字体大小或 DPI。JRE_HOME/lib/font/fontconfig.properties.src

问题没有解决方案吗?您是否有高 DPI 显示器?你是如何处理这样的应用程序的?Swing 会放弃高 DPI 用户吗?


答案 1

我目前正在Windows上调查此问题。以下是我的发现:

大多数 Swing Look & Feel 根本不支持高 DPI,甚至不支持 Nimbus,尽管它应该是可扩展的。我发现一些旧的博客文章说Nimbus最终可能会提供高DPI扩展,但显然这从未发生过。

一个例外是系统 LAF,但在所有 DPI 设置下,其默认字体比实际系统字体大小小约 10%。此外,必须显式选择系统,如下所述:http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

在 Swing 中也没有可以设置的单一比例因子。特定的 LAF 必须提供代码来处理缩放。因此,您能做的最好的事情就是选择“系统”,并希望它足够好。

但是,JavaFX确实可以正确并自动在我的系统上一直扩展到150%。如果可能的话,我建议你使用JavaFX来构建你的GUI。

编辑:我做了几个小测试程序,并为各种GUI框架,Swing主题和DPI设置进行了比较屏幕截图。对于阅读此问题的人来说,这可能会有所帮助:http://kynosarges.org/GuiDpiScaling.html


答案 2

简短的回答:您需要在JRE 9 +上运行它。

很长的答案:
这是因为Java运行时声明自己是“DPI感知”的,但并没有真正支持AWT和Swing。Java应用程序的大小和渲染是基于像素而不是正确缩放的,这包括HiDPI显示器。无论如何,这个问题最近已经解决了。请参阅问题 JEP 263:Windows 和 Linux 上的 HiDPI 图形升级

因此,增加字体大小不起作用(因为它不会增加其余部分);jvm参数不起作用(因为它并不真正受支持);并且清单文件+注册表编辑(对于Windows)不起作用。-Dsun.java2d.dpiaware=false

解决方案:您需要在 JRE 9+ 上运行它,因为它确实支持此功能。


推荐