当前位置: 首页 > 面试题库 >

JavaFX 8 HiDPI支持

谭昕
2023-03-14
问题内容

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

该文件说

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

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


问题答案:

各种设备上的Hi-DPI支持

对于具有视网膜显示的OS X Mac,它应该“正常工作”-JavaFX知道Hi-DPI
Mac,并将适当缩放UI。如果将VBox中的间距设置为8,则该间距与设备无关。在非视网膜显示器的Mac上,它将占用8像素;在具有两倍分辨率的视网膜显示器上,间距将占用16像素。由于视网膜显示器的DPI也是非视网膜显示器的两倍,因此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的支持有了很大的改进,但是要在窗口工具箱,标准应用程序和第三方应用程序中获得高质量的Hi-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显示进行充分优化(例如,视频显存不足),这可能导致应用程序无法运行或性能不佳。我也不相信目前在研究各种4K设备上的JavaFX性能上付出了很多努力-
它可能“奏效”,但也可能不起作用。您需要在目标硬件上测试您的应用程序,以确定JavaFX应用程序在该硬件上运行时的当前功能。您可能还需要根据上面的一些建议来调整应用程序。

背景

在OS X下支持Hi-DPI比Windows /
Linux设备简单(可能),因为目标设备是视网膜显示或非视网膜显示,其中一个是其他显示的2倍,并且可以利用OS
X系统的直接支持帮助实现视网膜缩放。在Windows / Linux中,可能需要的是缩放能力不只是2 倍的能力,并且(当前出色和计划中的)功能请求涵盖了此功能RT-32521支持基于DPI的默认值的全局坐标缩放。通常,按比例缩放比例可获得最佳可见效果。

其他资源

  • Kynosarges讨论JavaFX DPI缩放。
  • JavaFX团队的工作负载在视网膜Mac上的JavaFX上写了一个博客(这有点过时了,因为JavaFX现在支持视网膜Mac。)
  • 兰达关于JavaFX的观点:针对多种分辨率的设计。
  • 苹果公司为优化高分辨率设备的应用程序提供了一些不错的建议,它不是JavaFX特有的,其中一些建议不适用于JavaFX,但是那里仍然有一些有用的通用原理和技术。

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

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

维基答案

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



 类似资料:
  • 对于Requests,如果你有问题或者建议,可以通过下面几种方法得到支持: StackOverflow 如果你的问题不包含敏感或私有信息,或者你能将这些信息匿名化,那你就可以在 StackOverflow 上使用 python-requests 标签提问。 发送推文 如果你的问题在140个字符内描述,欢迎在 twitter 上发送推文至 @kennethreitz, @sigmavirus24,

  • Jython 是在 Java 平台 (JVM) 运行的 Python 实现。这个文档将让你在Jython之上运行Django。 Installing Jython Django使用Jython 2.7b2及更高版本。有关下载和安装说明,请参阅Jython网站。 Creating a servlet container 如果你只是想试验Django,请跳到下一节; Django包含一个可以用于测试的

  • Babel 的社区非常庞大并且增长速度很快,伴随着我们成长的同时我们希望保证人们总能获取他们需要的所有资源。 所以我们提供了数种途径来提供支持。 谨记在所有的这些沟通渠道里我们都共同遵守一套行为准则。 破坏准则的行为会被处理。 所以请阅读它并在与他人互动时注意自己的行为。 同时我们也在寻求发展一个自我支持式的社区,为那些始终热诚奉献的人们。 如果别人问的问题你恰好知道答案,请不吝花费几分钟帮帮他们

  • 如何让Java8与Eclipse一起工作? 我遵循了这个指南,但不起作用。我也看过EclipseJava8维基页面,但是他们没有解释如何处理签出的git存储库。

  • suEXEC特性使得Apache可以使用与调用web服务器的用户不同的用户身份来运行CGI和SSI程序。而通常情况下,CGI或者SSI程序执行时使用和web服务器相同的用户身份。 正确运用该特性,可以减少很多因为提供用户执行私有CGI或者SSI程序所带来的安全风险。但如果配置不当的话,则可能引起很多问题,使你的计算机产生更多的安全漏洞。如果你对管理 setuid root 程序以及可能导致的安全问

  • 有些项目的代码组织中使用了 git submodule 功能,但是如果某个项目引用的 submodule 是私有的,会导致代码构建/持续集成时拉取代码失败。这时可以参考下面的流程进行操作达到支持私有 submodule 的目的。 下面的例子以 Github 为例 创建项目 按照正常流程创建代码构建项目,在项目“设置”页面可以查看 Deploy Key。 复制 Deploy Key 点击如下所示红框

  • 写测试用例都很头疼,然而对核心方法的单元测试是非常重要的. nutz-plugins-mock 提供了 Ioc支持,Mvc环境, Servlet Mock对象 基本用法 添加依赖 <dependency> <groupId>org.nutz</groupId> <artifactId>nutz-plugins-mock</artifactId>

  • 什么是TypeScript TypeScript 是 JavaScript 的强类型版本,就然后在编译期去掉类型和特有语法,生成纯粹的 JavaScript 代码。由于最终在浏览器中运行的仍然是 JavaScript,所以 TypeScript 并不依赖于浏览器的支持,也并不会带来兼容性问题。 TypeScript 是 JavaScript 的超集,这意味着他支持所有的 JavaScript 语法