JavaFX 实际默认字体

7
我在特定的Windows 7机器上遇到了一个JavaFX应用程序问题,其中非英文文本显示不正确。字体在所有地方都设置为System,据我所知,在Windows 7上应该是Segoe UI(这确实是此机器上的默认字体)。
系统中其他部分(非Java部分)的所有文本都显示正确,因此字体存在并具有适当的字符集,这使我相信由于某种原因JavaFX默默地无法加载它,而是使用不同的字体。
我的问题是-如何找出JavaFX在特定系统上实际使用的字体?我尝试了Font.getDefault().getName(),但它只返回“System”,这对我毫无意义。 使用-Djavafx.verbose=true等也没有产生任何有价值的结果。
在你问之前-是的,应用程序是Unicode,并且在其他机器上,包括Windows和Linux,都可以正常工作。我想尝试诊断问题,以便我不必采取重新安装机器(目前无法选项)或像那样激动人心的事情。
编辑:似乎Segoe UI实际上不包含该特定字符集。尽管如此,系统的其余部分都可以正常工作。 因此,更准确的问题是-JavaFX为什么无法意识到这一点并使用回退?我该如何调试/诊断出错了什么?

仔细查看所涉及的字体后,似乎确实不包含所需的字符集(在我的情况下是希伯来语)。然而,在系统的任何其他地方,希伯来语文本都可以正常显示。因此,我猜现在的问题变成了 - 我如何告诉JavaFX后备系统出了什么问题? - Itai
1个回答

7

问题

Windows 7系统默认使用Segoe UI字体,但版本默认为5.01。因此,您无法使用此字体显示希伯来字符。Windows会在运行时通过另一个能够显示这些字符的字体替换缺失的希伯来字体字符。

因此,如果您没有将Segoe UI字体更新到至少版本5.13,则始终会被替换。但是JavaFX无法这样做,因为它获取系统默认字体(位于字体系列“System”中)。获取字体后,它不会对其进行字符替换。

Windows 7字体首选项

如果您进入系统首选项,然后进入字体,您应该会看到详细视图中,Segoe UI不支持希伯来字符。

Win7Font

Windows 8.1字体首选项

如果您进入系统首选项,然后进入字体,您应该会看到详细视图中,Segoe UI支持希伯来字符。

Win8Font

还要查看类别,如果未设置为“文本”,则可能不是默认字体。

解决方法

使用CSS定义字体

为整个应用程序设置另一种能够显示希伯来语的字体。这在此处进行了描述:https://dev59.com/oWMl5IYBdhLWcg3wbGh1#18409438

通过加载字体来定义字体

我展示了一些其他方式,您可以将所需的字体放置在项目中并从那里调用它:https://stackoverflow.com/a/31291372/4170073

结论

为确保正确显示您的语言,您必须打包和使用自己的字体。否则,您将永远无法确定在另一个系统上您的文本是否会正确显示。这不是权宜之计,而是(JavaFX、Swing)应用程序的标准做法。


这几乎不是一个解决方案,因为其他平台上可能没有另一种字体可用! 为什么其他任何程序都可以找出Segoe UI不包含希伯来字符并使用备用字体,但JavaFX却不能? 我甚至有另一台安装了相同Segoe UI字体版本的Windows 7机器,但在它上面应用程序可以正常工作。 - Itai
请查看以下关于JavaFX字体处理的问题:http://www.guigarage.com/2014/10/integrate-custom-fonts-javafx-application-using-css/ - aw-think
1
感谢您的建议和帮助尝试,但这些只是解决问题的权宜之计,而本来不应该出现这个问题。我有兴趣找到问题的根源,并且正如我所说 - 在另一台安装了相同Segoe UI版本的Windows 7机器上,完全相同的事情可以正常运行。 - Itai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接