如何在 JavaFX 中使用后备字体?

问题描述 投票:0回答:2

对于我目前正在使用 JavaFX 进行的项目,我希望用户能够输入可以包含多种语言的 Deck 名称(例如日本语 N4 Vocab)。

为了能够正确显示多种语言的字体,我尝试在文本字段的 css 中指定多种字体,如下所示:

.text-field {
    -fx-font-family: "Work Sans", "Noto Sans JP";
}

但我意识到 JavaFX 不支持 -fx-font-family 属性中以逗号分隔的一系列字体系列名称。

所以我有几个问题:

  1. 如上所述使用后备字体是支持标签/文本字段使用多种字体的正确方法吗?
  2. 如果是,我该如何绕过这个限制来实现这个功能。
  3. 如果没有,我还应该做些什么来改善JavaFX中多语言字符串的渲染?

更新 |这是我尝试过的:

@font-face {
    src: url('WorkSans-Regular.ttf');
}

@font-face {
    src: url('WorkSans-Bold.ttf');
}

@font-face {
    src: url('NotoSans-Regular.ttf');
}

.text-area {
    -fx-font-size: 30;
    -fx-font-family: 'Work Sans';
    -fx-font-weight: bold;
}

这是输入不支持的字符时 TextArea 显示的内容:

css javafx font-face
2个回答
0
投票

来自 JavaFX CSS 参考

JavaFX CSS 不支持 -fx-font-family 属性中以逗号分隔的一系列字体系列名称。不支持指定字体时的可选行高参数。 font-variant 属性没有等效项。

可能的解决方法:

  1. 在 CSS 中:您可以通过 @font-face 定义和使用多种字体。
@font-face {
  src: url("../fonts/Roboto-Medium.ttf");
}
    
.my-text {
  -fx-font-family: roboto;
}

  1. 在您的代码中:您可以检查/使用 Font.loadFont() 或 Font.font()。

更新:添加字体代码

我的演示代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        TextArea ta = new TextArea();

        VBox vbox = new VBox(ta);
        Scene scene = new Scene(vbox, 640, 480);
        scene.getStylesheets().add("style.css");
        stage.setScene(scene);
        stage.setTitle("JavaFX App");
        stage.show();

    }

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

样式.css

@font-face {
    src: url("fonts/WorkSans-Regular.ttf");
}

@font-face {
    src: url("fonts/NotoSans-Regular.ttf");
}

.text-area {
    -fx-font-size: 30;
    -fx-font-family: 'Work Sans';
    -fx-font-weight: bold;
}

我在 macOS Mojave 上的屏幕截图:

也许您的操作系统中没有不同语言的字体。尝试在您的操作系统中安装字体。

更新2:添加演示代码。


0
投票

正如评分最高的答案中所述,不可能通过 JavaFX 的 css 直接配置后备字体。

但是在利用内部 JavaFX API 时这是可能的。通过反射 API 直接操作底层

FontResource
是可能的。

这里有一个 demo,展示了如何使用 JavaFX 21 来完成此操作。

© www.soinside.com 2019 - 2024. All rights reserved.