Java Swing HiDPI缩放

4
我使用Java 8在Eclipse IDE中创建了一个程序,利用Swing GUI来缩放图像和图标到合适的尺寸并获取并使用屏幕分辨率。在Eclipse中编译程序时,程序显示完美,一切看起来都正常运行。但是,在将项目导出为“Runnable Jar”后运行程序时,图像缩放和程序外观都出现了问题。经进一步调查发现,Runnable Jar返回的屏幕分辨率比Eclipse中实际分辨率小2.5倍(Eclipse实际分辨率为3840x2160,而Runnable Jar返回的是1536x864)。网络上有一些间接证据表明,Java 8 Look and Feel(或类似物)不支持HiDPI屏幕缩放。有些解决方案声称可以解决问题,比如升级到Java版本8以上,或通过添加参数到jar编译等。这对于Java新手已经很困惑了,而且程序在Eclipse IDE中运行/编译时却完全正常显示,只会让事情更加复杂。我的问题是是否有人知道如何让使用Swing编写的Java程序在HiDPI屏幕上正确缩放,并需要遵循哪些流程才能编译出一个工作良好的程序?编辑1:值得注意的是,在Windows设置中,“缩放和布局”,“更改文本,应用程序和其他项目的大小”设置为250%。这意味着这个设置明显是我遇到的缩放问题的原因。有人知道如何在程序内部绕过此设置,或者为什么在Eclipse中运行时它可以正常工作吗?

Eclipse在启动配置中使用了哪些参数? - Thorbjørn Ravn Andersen
1
根据我的经验,第一个能够正确处理HiDPI屏幕的Java版本是Java 12。尝试使用Java 12运行(无需编译)您的应用程序,看看是否有所改善。 - user330315
据我所知,Eclipse在运行程序时没有使用任何参数(参数?)@ThorbjørnRavnAndersen - Matthew Brian
@a_horse_with_no_name 由于某种原因,我删除了系统上的所有其他Java版本,改用Java 12,这在某种程度上起作用了。突然间,屏幕上的文本分辨率开始正确地缩放到合适的大小,但错误的屏幕分辨率问题仍然存在。 - Matthew Brian
在Eclipse中,什么是“运行配置”用于启动程序?从Eclipse菜单中选择“运行”>“运行配置...”。 - Abra
如果你调整HiDPI显示器的比例,你会得到一个较小的有效分辨率 - 我想这是可以预料的。 - user330315
1个回答

4

Java 8不支持高DPI。在Windows上,它以DPI无感知模式运行,并依赖于Windows将窗口位图拉伸到设置中为监视器设置的比例。这意味着应用程序的UI在高DPI显示器上显示时会显得模糊。

Java的后续版本,Java 11及以上版本,支持每个监视器的高DPI设置。您的应用程序的UI根据设置正确缩放,文本保持清晰。为了使图标和图像保持清晰,您应该使用MultiResolutionImage或其基本实现BaseMultiResolutionImage提供更高分辨率的替代方案。

您不应该基于屏幕分辨率来制作图像,而是应该基于监视器设置的比例。例如,具有150%比例的全高清显示器1920×1080具有有效分辨率1280×720,这是Java向您报告的有效分辨率。


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