25

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

文件说_

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

那么如何让我的应用程序知道 dpi 呢?

4

2 回答 2

35

各种设备上的 Hi-DPI 支持

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

对于 Windows 和 Linux 设备,您的结果可能不太令人满意,因为 JavaFX 8u20 目前默认情况下不会在此类设备上计算出任意 DPI 分辨率并适当地扩展到它们。您可以做的是将css 中的大部分测量作为 em 单位(基于场景根默认字体的点大小)和fxml 类似,然后根据具体情况适当设置场景根默认字体的点大小您通过查询屏幕的 DPI 分辨率确定的内容。有关更多信息和示例代码,请参阅此答案中的讨论:javafx automatic resizing and button padding

特定于 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 的支持有了很大改进,但要在窗口工具包、标准应用程序和第三方应用程序之间实现高质量的 Hi-DPI 支持,还有很长的路要走。出于这个原因,我相信运行 HiDPI Gnome 桌面仍然是一件非常前沿的事情,绝对不适合所有人——我相信这种情况会随着时间的推移而改变。

位图图像

来自 JavaFX 团队负责人关于 Hi-DPI 的博客文章

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

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

4K 设备

4K 需要大量像素。当图形管道可用时,JavaFX 将默认使用硬件加速图形管道。某些图形硬件可能没有针对 4K 显示器进行完全优化(例如,没有足够的视频内存),这可能会导致应用程序无法运行或性能不佳。我也不相信目前在各种 4K 设备上研究 JavaFX 性能方面付出了很多努力——它可能“正常工作”,但也可能不行。您需要在目标硬件上测试您的应用程序,以确定 JavaFX 应用程序在该硬件上运行时的当前功能。您可能还需要根据上面的一些建议调整应用程序。

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

背景

在 OS X 下支持 Hi-DPI (可能)比 Windows/Linux 设备更简单,因为目标设备是视网膜或非视网膜显示器,其中一个是另一个的 2 倍比例,并且可以利用 OS X 系统的直接支持帮助实现视网膜缩放。对于 Windows/Linux,可能需要的是能够以除 2 倍以外的因素进行缩放,这已包含在(当前未完成和计划的)功能请求RT-32521 Support global coordinate scaling with DPI-based default中。按整数缩放通常会产生最佳的可见结果。

其他资源

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

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

维基答案

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

于 2014-10-03T18:16:16.993 回答
1

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

于 2019-11-26T14:11:36.023 回答