对于我目前正在使用 JavaFX 进行的项目,我希望用户能够输入可以包含多种语言的 Deck 名称(例如日本语 N4 Vocab)。
为了能够正确显示多种语言的字体,我尝试在文本字段的 css 中指定多种字体,如下所示:
.text-field {
-fx-font-family: "Work Sans", "Noto Sans JP";
}
但我意识到 JavaFX 不支持 -fx-font-family 属性中以逗号分隔的一系列字体系列名称。
所以我有几个问题:
更新 |这是我尝试过的:
@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 显示的内容:
来自 JavaFX CSS 参考:
JavaFX CSS 不支持 -fx-font-family 属性中以逗号分隔的一系列字体系列名称。不支持指定字体时的可选行高参数。 font-variant 属性没有等效项。
可能的解决方法:
@font-face {
src: url("../fonts/Roboto-Medium.ttf");
}
.my-text {
-fx-font-family: roboto;
}
更新:添加字体代码
我的演示代码:
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:添加演示代码。
正如评分最高的答案中所述,不可能通过 JavaFX 的 css 直接配置后备字体。
但是在利用内部 JavaFX API 时这是可能的。通过反射 API 直接操作底层
FontResource
是可能的。
这里有一个 demo,展示了如何使用 JavaFX 21 来完成此操作。