【问题标题】:javafx actual default fontjavafx 实际默认字体
【发布时间】:2015-09-29 09:40:34
【问题描述】:

我在特定 Windows 7 机器上的 JavaFX 应用程序存在问题,非英文文本显示不正确。字体在任何地方都设置为 System,据我了解,这应该是 Windows 7 上的 Segoe UI(这确实是这台机器上的默认字体)。 系统其他部分(非java)中的所有文本都正确显示,因此字体存在并且具有适当的字符集,这让我相信JavaFX出于某种原因默默地无法加载它,而是使用不同的字体.

我的问题是 - 我怎样才能找出 JavaFX 在特定系统上 实际 使用的字体?我试过Font.getDefault().getName(),但它只是返回“系统”,它什么也没告诉我。 使用-Djavafx.verbose=true 等也没有产生任何价值。

在您问之前 - 是的,该应用程序是 Unicode,它可以在其他机器上运行,包括 windows 和 linux,没有问题。我想尝试诊断问题,这样我就不必求助于重新安装机器(目前这不是一个选项),或者像戏剧性的那样。

编辑:Segoe UI 似乎实际上不包含该特定字符集。尽管如此,系统的其余部分都很好。 所以一个更准确的问题是 - 为什么 JavaFX 没有意识到这一点并使用回退?以及如何调试/诊断出了什么问题?

【问题讨论】:

  • 更仔细地查看有问题的字体,它似乎确实不包含所需的字符集(在我的例子中是希伯来语)。尽管如此,系统希伯来语文本中的其他任何地方都可以正常显示。所以我想现在的问题变成了——我如何判断 JavaFX 的后备系统出了什么问题?

标签: fonts javafx


【解决方案1】:

问题

在您的 Windows 7 系统上有一个 Segoe UI 作为默认字体,但默认版本是 5.01。因此,您无法使用此字体显示希伯来语字符。 Windows 将在运行时将丢失的希伯来字体字符替换为另一种能够显示它们的字体。

因此,如果您尚未将 Font Segoe UI 更新到最低版本 5.13,那么它将始终被替换。但是 JavaFX 无法做到这一点,因为它获得了系统默认字体(在 Font Family System 中)。得到字体后,不会替换上面的字符。

Windows 7 字体首选项

如果您转到系统偏好设置,然后转到字体,您应该会在详细信息视图中看到 Segoe UI支持希伯来语字符。

Windows 8.1 字体首选项

如果您转到系统偏好设置,然后转到字体,您应该会在详细信息视图中看到 Segoe UI支持希伯来语字符。

即使看一下类别,如果它没有设置为 Text,那么它可能不会是默认字体。

解决方案

用 CSS 定义字体

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

通过加载来定义字体

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

结论

为确保您的语言正确显示,您必须捆绑并使用您自己的字体。否则,您将永远无法确定在另一个系统上您的文本会正确显示。这不是一种变通方法,这是(JavaFX、Swing)应用程序会这样做的方式。

【讨论】:

  • 这几乎不是一个解决方案,因为另一种字体不一定在其他平台上可用!为什么其他程序可以找出 Segoe UI 不包含希伯来字符并使用回退,但 JavaFX 不能?我什至还有另一台具有相同 Segoe UI 字体版本的 Windows 7 机器,但在它上面应用程序运行良好。
  • 您可以在这里查看有关 JavaFX 字体处理的问题:guigarage.com/2014/10/…
  • 感谢您的意见和尝试提供帮助,但这些只是解决原本不应该发生的问题的解决方法。我有兴趣找到问题的根源,正如我所说 - 完全相同的事情在另一台 Windows 7 机器上运行,具有相同的 Segoe UI 版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多