【问题标题】:JavaFX CSS font family doesn't get applied on Label control in Xubuntu 16.04JavaFX CSS 字体系列未应用于 Xubuntu 16.04 中的标签控件
【发布时间】:2020-01-07 16:51:44
【问题描述】:

问题

大家好,我已经设置了以下 JavaFX CSS 来处理 Label 控件以显示我的计算器应用程序的总和。

.label-sumtotal {
  -fx-font-family: "Noto Sans CJK SC Bold", Arial, sans-serif;
  -fx-text-fill: color-crimson;
  -fx-font-size: 32pt;
  -fx-font-weight: bold;
}

这是它在 Windows 和 Xubuntu 14.04

上的正确显示方式

这就是它在 Xubuntu 16.04

上的外观错误


到目前为止我在 Xubuntu 16.04 上测试过的内容

  • 我更改为 Xubuntu 16.04 包含的另一个字体系列, 然而Label 仍然没有改变它的字体系列,也没有改变它的 字体粗细。

  • 但是当我将控件从 Label 更改为 Text 而不触摸 任何 CSS 代码,然后以某种方式识别字体系列并 已申请。


我的问题

如何让Label 控件在Xubuntu 16.04 上显示字体系列?我不想使用Text 控件,因为它没有Label 那样的某些格式化功能。

【问题讨论】:

  • JavaFX CSS reference guide 声明:“JavaFX CSS 不支持 -fx-font-family 属性中以逗号分隔的字体系列名称。不支持指定字体时的可选行高参数。” .因此,也许尝试这样做会使系统感到困惑。
  • 另外,color-crimson 不是有效颜色,它应该只是 crimson
  • 至于深红色,我已经在 CSS 中声明它像这样color-crimson: #dc143c;。因此我可以在 CSS 的其他部分重用color-crimson
  • 至于“-fx-font-family 属性中以逗号分隔的字体系列名称”,我删除了其他字体,只保留了一个。然而仍然没有任何改进。我想知道 JavaFX 是如何以及在哪里获得其默认字体系列的,也许默认值已经不断覆盖我的。
  • 运行这个:System.out.println(String.join("\n", Font.getFamilies())); 找出可用的字体系列,如果你想明确知道它是如何确定这些的,请阅读 JavaFX 源代码(据我所知,它没有在任何地方记录和实现将取决于平台)。

标签: css javafx label ubuntu-16.04 font-family


【解决方案1】:

我没有 Ubuntu 系统,但您可以尝试以下使用从 Web 加载的 Noto Sans SC Bold 字体(在 Mac 上适用于我)来设置标签样式。我在 Mac 上的输出与您说在 Windows 和 Xubunto 14.04 上正确的输出相同。

Noto Sans SC Bold 的 Google 网络字体参考:

解决方案是从 Google 加载网络字体,而不是依赖应用或操作系统预先打包的字体。

从网页加载的字体版本指定为Noto+Sans+SC:700,所以字体已经加粗了,所以我没有在css中指定粗体,而是指定了一个" -fx-font-family 的 Noto Sans SC Bold" 值。您仍然可以拥有-fx-font-weight: bold;,然后您可能最终会使用双粗体字体,一次来自字体本身,然后再次来自粗细设置。在这种情况下,我必须在家族中使用“粗体”一词,否则将找不到它(这与 Google 在标准 HTML CSS 中使用网络字体的说明相反,它不需要“粗体”以名称)。

您还可以从 Google 下载字体为 .ttc 文件,并使用以下指定的解决方案从本地资源加载字体:

但是,我运行的 JavaFX 版本早于该功能所需的最低版本 9,因此我没有尝试使用嵌入字体。

我知道,很可能,您的未正确显示字体的 Xubuntu 系统必须已经在某个地方拥有它(否则在使用 Text 而不是 Label 时它将无法正确显示字体)。但是,在您描述的情况下,我不知道如何让它正确地为标签选择本地操作系统字体,这就是为什么我建议尝试使用 webfont 或嵌入字体。

示例 CSS

.label-sumtotal {
    -fx-font-family: "Noto Sans SC Bold";
    -fx-text-fill: crimson;
    -fx-font-size: 32pt;
}

网页字体示例应用

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class NotoFontApp extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Label label = new Label("5,40\u20AC");
        label.getStyleClass().add("label-sumtotal");

        Pane layout = new StackPane(label);
        layout.setPadding(new Insets(10));
        Scene scene = new Scene(layout);
        scene.getStylesheets().add(
                NotoFontApp.class.getResource("font.css").toURI().toURL().toExternalForm()
        );
        scene.getStylesheets().add(
                "https://fonts.googleapis.com/css?family=Noto+Sans+SC:700&display=swap"
        );

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

【讨论】:

  • 您周到而全面的回答给我留下了深刻的印象。我将尝试按照您的建议将其用作 webfont 并回复我的结果。嵌入字体是毫无疑问的,因为它会使我已经很大的应用程序 (150MB) 的大小再增加 10%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 2016-12-25
  • 2020-06-22
  • 1970-01-01
相关资源
最近更新 更多