【问题标题】:JavaFX 8 HiDPI SupportJavaFX 8 HiDPI 支持
【发布时间】:2014-11-28 17:15:54
【问题描述】:

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

documentation

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

那么我怎样才能让我的应用程序知道 dpi?

【问题讨论】:

  • 除了您的应用程序之外,您的操作系统的任何部分是否正确支持“HI-DPI”模式? According to the Arch Wiki,HiDPI 支持充其量是参差不齐。
  • 我使用支持 HiDPI 缩放因子的 gnome。

标签: java javafx-8 hdpi


【解决方案1】:

在各种设备上支持 Hi-DPI

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

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

特定于 Gnome

Gnome 3 有一个setting for the scaling factor,可以通过这个命令控制:

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

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

只是个人轶事 - 几天前,当我尝试在 Hi-DPI 显示器上使用 Gnome 3 缩放(CentOS 7 和最近的 Fedora 版本)时,我发现运行在Linux 相当参差不齐。当然,当我尝试这样做时,支持比 CentOS 6 有了很大的改进,但是要在窗口工具包、标准应用程序和第三方应用程序之间实现高质量的 Hi-DPI 支持,还有很长的路要走。出于这个原因,我相信运行 HiDPI Gnome 桌面仍然是一件非常前沿的事情,绝对不是每个人都适合 - 我相信这种情况会随着时间的推移而改变。

位图图像

来自 JavaFX 团队负责人blog entry on 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 developer mailing list 提问。

维基答案

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

【讨论】:

  • 感谢您提供全面的答复。我将尝试在不同平台上的工作原理。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多