Java 摆动 HiDPI 缩放

Java Swing HiDPI Scaling

我使用 Java 8 创建了一个程序,该程序在 Eclipse IDE 中使用了 Swing GUI。为了将图像和图标缩放到适当的大小,它获取并使用屏幕分辨率。在 Eclipse 中编译程序后,程序显示得非常好,一切似乎都在按预期运行。但是,当我将项目导出为 "Runnable Jar" 和 运行 程序时,图像缩放和程序外观都关闭了。

经过进一步调查,运行nable jar 返回的屏幕分辨率似乎比 eclipse 中的屏幕分辨率低 2.5 倍(这是实际分辨率 - 3840x2160 与 1536x864)。互联网上有间接证据表明 Java 8 外观(或类似的东西)不支持 HiDPI 屏幕缩放。有零散的解决方案声称可以解决问题,例如更新到 8 之后的 Java 版本,或者通过向 jar 编译添加参数(无论那是什么意思)。这已经让 Java 新手感到困惑,并且当 run/compiled 在 Eclipse IDE.

中完美显示程序时,只会使它更加混乱

我的问题是是否有人知道如何使用 Swing 在 Java 中编译程序以在 HiDPI 屏幕上正确缩放,以及编译工作程序需要遵循什么过程?

编辑 1:值得注意的是,在我的 Windows 设置中,"Scale and Layout"、"Change the size of text, apps, and other items" 设置为恰好 250%,这意味着此设置显然是原因我遇到的缩放问题。有人知道如何从程序中绕过此设置,或者为什么当我通过 Eclipse 运行 它时它有效?

Java8不支持高DPI。在 Windows 上,它以 DPI 无意识模式运行,并依赖 Windows 将 window 位图拉伸到设置中为显示器设置的比例。这意味着应用程序 UI 在高 DPI 显示器上显示时看起来很模糊。

Java、Java11及以上版本,支持per-monitor高DPI设置。您的应用程序的 UI 已根据设置正确放大,文本仍然清晰。为了使图标和图像保持清晰,您应该使用 MultiResolutionImage or its basic implementation BaseMultiResolutionImage 提供更高分辨率的替代方案。

您的图像不应基于屏幕分辨率,而应基于为监视器设置的比例。比如1920×1080的150%全高清显示器,有效分辨率为1280×720,就是Java报给你的有效分辨率。