JavaFX 8 HiDPI 支持

2022-09-01 18:59:29

我刚刚在Arch Linux上的4k屏幕上尝试了JavaFX Hello World示例,但不幸的是GUI无法扩展。

文档

支持高 DPI。JavaFX 8 现在支持 Hi-DPI 显示器。

那么,如何使我的应用程序 dpi 感知呢?


答案 1

在各种设备上支持高 DPI

对于带有视网膜显示屏的OS X Mac,它应该“正常工作” - JavaFX知道Hi-DPI Mac,并将适当地扩展UI。如果将 VBox 中的间距设置为 8,则这是一个与设备无关的单元;在非视网膜显示器Mac上,它将占用8个像素,在分辨率翻倍的视网膜显示器上,间距将占用16个像素。由于视网膜显示器的DPI也是非视网膜显示器的两倍,因此无论设备如何,空间的物理屏幕测量值都将相同。

对于 Windows 和 Linux 设备,您的结果可能不太令人满意,因为 JavaFX 8u20 当前默认情况下不会在此类设备上计算任意 DPI 分辨率并相应地进行缩放。您可以做的是以 css 中以 em 单位(基于场景根默认字体的磅大小)和类似方式对 fxml 执行大部分测量,然后根据您通过查询屏幕的 DPI 分辨率确定的内容,适当地设置场景根默认字体的磅大小。有关更多信息和示例代码,请参阅此答案中的讨论:javafx 自动调整大小和按钮填充

特定于 Gnome

Gnome 3 有一个比例因子的设置,可以通过以下命令控制:

gsettings set org.gnome.desktop.interface scaling-factor 2

您可以通过读取用户的 gnome 配置文件设置来查询此比例因子,并将其与查询屏幕 DPI 结合使用,以确定适当的比例因子,然后如何使用上述技术应用缩放。

只是一个个人轶事 - 几天前,当我在Hi-DPI显示器上尝试使用Gnome 3扩展(CentOS 7和最近的Fedora版本)时,我发现在Linux下运行的应用程序对Hi-DPI的整体支持非常不稳定。當然,當我嘗試這一點時,CentOS 6 的支持有很大的改善,但要在開窗工具包、標準應用程式和第三方應用程式上實現高 DPI 的特質支持,還有相當多的途徑。出于这个原因,我相信运行HiDPI Gnome桌面仍然是一件非常前沿的事情,绝对不适合每个人 - 我相信这种情况会随着时间的推移而改变。

位图图像

来自 JavaFX 团队在 Hi-DPI 上的一篇博客文章:

在Apple的应用程序中(从带有视网膜显示屏的iPhone和iPad开始),问题的解决方案是应用程序开发人员提供两个图像,而不是为每个图像资产提供一个图像。例如,初始屏幕将提供两个图像,一个是正常分辨率,另一个是分辨率的 2 倍。这些文件的名称相同,但2x文件是根据某种约定命名的,因此在运行时,平台将在幕后查找视网膜上的2x版本。通过这种方式,您的应用程序显示“fooImage.png”,但是当在具有视网膜显示器的计算机上时,会查找“fooImage@2x.png”。

我不知道这个用于Hi-DPI显示器的位图图像选择功能目前是否在Java 8u20中 - 您可能必须通过使用screen.getDpi()查询屏幕来自己实现它,然后加载适当的位图。

4K 设备

4K需要推动很多像素。默认情况下,当硬件加速图形管道可用时,JavaFX 将使用此类图形管道。某些图形硬件可能没有针对4K显示进行完全优化(例如,没有足够的视频RAM),这可能导致应用程序无法正常工作或性能不佳。我也不相信目前已经花了很多精力来研究各种4K设备上的JavaFX性能 - 它可能“只是工作”,但也可能不行。您需要在目标硬件上测试应用程序,以确定在该硬件上运行 JavaFX 应用程序时的当前功能。您可能还需要根据上面的一些建议调整应用程序。

用户在尝试使用 JavaFX 显示 4K 视频时报告了 JavaFX 8u20 的问题:

背景

在OS X下支持Hi-DPI(可能)比Windows / Linux设备更简单,因为目标设备要么是视网膜显示器,要么是非视网膜显示器,其中一个是另一个的精确2倍比例,并且可以利用OS X系统的直接支持来帮助实现视网膜缩放。对于Windows/Linux,可能需要的是能够以2x以外的因素进行扩展,而这被(当前未完成和计划的)功能请求RT-32521使用基于DPI的默认值支持全局坐标缩放所涵盖。按整数量缩放通常可提供最佳的可见效果。

其他资源

Hi-DPI设备编码的完整指南超出了此特定答案的范围 - 您可以谷歌各种Web资源以获取更多信息。

如果您对JavaFX的Hi-DPI支持还有其他疑问,我建议您在openjfx-dev JavaFX开发人员邮件列表中询问他们。

维基答案

此答案可能有一些可能的不一致或错误,并且可能会随着时间的推移而持续。我已经做了答案社区维基。如果您知道JavaFX上对Hi-DPI的特定更正,设备和操作系统限制或支持模型支持,请随时编辑此答案或将其移动到OpenJFX wiki(无论如何它可能属于那里)。


答案 2

我遇到了同样的问题。我在我的surface pro 3中构建了javaFX应用程序,它没有扩展,但fxml应用程序可以扩展。然后我安装了jre8u221,并替换了它建议的更新版本。它解决了问题


推荐