JavaFX 8 HiDPI支持

时间:2014-10-03 15:55:42

标签: java javafx-8 hdpi

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

documentation

  

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

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

2 个答案:

答案 0 :(得分:32)

各种设备上的Hi-DPI支持

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

对于Windows和Linux设备,您的结果可能不太令人满意,因为JavaFX 8u20目前默认情况下不会在此类设备上计算出任意DPI分辨率并适当缩放。你可以做的是在css as em units中执行大部分测量(基于场景的点大小&#39的默认字体)和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版本)时,我发现在运行的应用程序中对Hi-DPI的整体支持Linux很不稳定。当然,当我尝试使用CentOS 6时,支持得到了很大改善,但是仍然有很多方法可以通过窗口工具包,标准应用程序和第三方应用程序实现高质量的Hi-DPI支持。出于这个原因,我认为运行HiDPI Gnome桌面仍然是一个非常流行的东西,绝对不适合所有人 - 我相信这种情况会随着时间的推移而改变。

位图图片

来自JavaFX团队负责人blog entry on 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,可能需要的是能够以非2倍的因子进行扩展,并且由(当前未完成和已调度的)功能请求RT-32521 Support global coordinate scaling with DPI-based default涵盖。按比例缩放通常可以获得最佳的可见结果。

其他资源

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

如果您对Hi-DPI对JavaFX的支持有任何疑问,我建议您在openjfx-dev JavaFX developer mailing list上询问他们。

维基百科答案

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

答案 1 :(得分:1)

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