首先,我是编码方面的新人。我需要在我的基于javaFXML的应用程序中嵌入一个字体,并且不知道该怎么做。我已将字体fontName.ttf
粘贴到"资源"我的项目源根目录中的文件夹,即App/src/app/resources
。我已将组件(文本)的CSS设置为
#text {
-fx-font-family: url(resources/fontName.ttf);
}
我还尝试在网址中添加引号,即url("resources/fontName.ttf");
,但它不起作用。我还为组件设置了css id,因此无法解决问题。还有其他工作方式吗?我见过http://fxexperience.com/2010/05/how-to-embed-fonts/,但由于我有jdk 1.7 u21,所以它不起作用。有关正确嵌入字体的方法的想法吗?
答案 0 :(得分:37)
解决方法
我更新了Javafx How to display custom font in webview?中的示例,以演示在使用CSS设置样式的JavaFX控件中使用自定义真实字体。
要点是:
Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
-fx-font-family
css属性,并仅引用字体名称(例如,在此情况下为"TRON"
)。其他信息
如果您使用的是Java 8,则可能对Use web(Google) fonts in JavaFX感兴趣。
使用自定义字体输出样本
示例代码
该示例依赖于TRON.TTF字体,您可以从dafont下载该字体。
CustomFontApp.java
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.image.*;
import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Stage;
// demonstrates the use of a custom font.
public class CustomFontApp extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
stage.setTitle("TRON Synopsis");
// load the tron font.
Font.loadFont(
CustomFontApp.class.getResource("TRON.TTF").toExternalForm(),
10
);
Label title = new Label("TRON");
title.getStyleClass().add("title");
Label caption = new Label("A sci-fi flick set in an alternate reality.");
caption.getStyleClass().add("caption");
caption.setMaxWidth(220);
caption.setWrapText(true);
caption.setTextAlignment(TextAlignment.CENTER);
VBox layout = new VBox(10);
layout.setStyle("-fx-padding: 20px; -fx-background-color: silver");
layout.setAlignment(Pos.CENTER);
layout.getChildren().setAll(
title,
new ImageView(
new Image(
"http://ia.media-imdb.com/images/M/MV5BMTY5NjM2MjAwOV5BMl5BanBnXkFtZTYwMTgyMzA5.V1.SY317.jpg"
)
),
caption
);
// layout the scene.
final Scene scene = new Scene(layout);
scene.getStylesheets().add(getClass().getResource("custom-font-styles.css").toExternalForm());
stage.setScene(scene);
stage.show();
}
}
定制字体styles.css的
/** file: custom-font-styles.css
* Place in same directory as CustomFontApp.java
*/
.title {
-fx-font-family: "TRON";
-fx-font-size: 20;
}
.caption {
-fx-font-family: "TRON";
-fx-font-size: 10;
}
关于FXML使用
Font.loadFont(url, size)是一个采用两个参数的静态方法。我不认为你可以从FXML调用font.loadFont,如果可以,也不会建议它。相反,在加载需要字体的FXML或样式表之前,在Java代码中加载字体(正如我在答案中所做的那样)。
答案 1 :(得分:13)
我知道您并没有要求在java fx应用程序中使用自定义TTF字体的纯编程方式,但我想也许有人可以看到程序化版本:
public class Test2 extends Application {
public static void main(String[] args) {
launch(args);
}
public void start(final Stage primaryStage) {
Group rootGroup = new Group();
// create a label to show some text
Label label = new Label("Demo Text");
try {
// load a custom font from a specific location (change path!)
// 12 is the size to use
final Font f = Font.loadFont(new FileInputStream(new File("./myFonts/TRON.TTF")), 12);
label.setFont(f); // use this font with our label
} catch (FileNotFoundException e) {
e.printStackTrace();
}
rootGroup.getChildren().add(label);
// create scene, add root group and show stage
Scene scene = new Scene(rootGroup, 640, 480, Color.WHITE);
primaryStage.setScene(scene);
primaryStage.show();
}
}
这对我有用。您可以将字体放在任何位置,只需确保调整路径。
您可以找到更多关于using fonts inside java fx apps here.
的信息HTH