如何在JavaFx 2.2中嵌入.ttf字体?

fonts embed javafx fxml

30968 观看

2回复

390 作者的声誉

首先,我是编码方面的新手。我需要在基于javaFXML的应用程序中嵌入字体,但不知道该怎么做。我将字体粘贴到fontName.ttf了项目源代码根目录下的“ resources”文件夹中App/src/app/resources。我已经将组件(文本)的CSS设置为

#text {
    -fx-font-family: url(resources/fontName.ttf);
}

我也尝试在url中添加反逗号,即url("resources/fontName.ttf");,但是不起作用。我还为该组件设置了css id,所以这不是问题。还有其他工作方式吗?我看过http://fxexperience.com/2010/05/how-to-embed-fonts/,但是由于我安装了jdk 1.7 u21,因此无法正常工作。关于嵌入字体的正确方法有什么想法吗?

作者: Pratik Anand 的来源 发布者: 2013 年 5 月 31 日

回应 (2)


38

116347 作者的声誉

决定

解决方法

我从Javafx更新了示例。如何在Webview中显示自定义字体?演示如何在使用CSS样式的JavaFX控件中使用自定义的真型字体。

关键点是:

  1. 将字体放置在与应用程序类相同的位置,并确保构建系统将其放置在二进制构建包(例如,应用程序jar文件)中。
  2. 在应用使用字体的样式之前,请在JavaFX代码中加载代码字体。 Font.loadFont(CustomFontApp.class.getResource("TRON.TTF").toExternalForm(), 10);
  3. 要在样式类中使用自定义字体,请使用-fx-font-familycss属性,并仅引用字体名称(例如在这种情况下"TRON")。
  4. 创建并加载定义样式类的样式表。
  5. 将样式类应用于控件。

附加信息

如果您使用的是Java 8,则可能对JavaFX中的使用web(Google)字体感兴趣。

字体集

如果您的字体文件是.ttc格式文件,并且在一个文件中包含多个字体,请使用Font.loadFontsAPI(而不是Font.loadFont)。请注意,Font.loadFonts仅自JDK 9起可用,而在早期版本中不可用。

使用自定义字体的示例输出

tronfonts

样例代码

该示例依赖于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代码加载字体(就像我在回答中所做的那样)。

作者: jewelsea 发布者: 31.05.2013 10:32

13

10000 作者的声誉

我知道您没有要求在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();
  }
}

那为我做了工作。您可以将字体放置在所需的任何位置,只需确保调整路径即可。

您可以在此处找到有关在Java fx应用程序内部使用字体的更多信息

HTH

作者: Chris 发布者: 14.09.2014 11:45
32x32