【问题标题】:Cannot use custom font in javaFX using CSS Styling无法使用 CSS 样式在 javaFX 中使用自定义字体
【发布时间】:2022-01-13 12:11:32
【问题描述】:

我正在尝试使用 CSS 将全局字体添加到我的 javaFX 应用程序。 我关注了this answer,但是我似乎无法加载字体,并且错误消息没有帮助。

jan 12, 2022 12:24:25 PM javafx.css.CssParser reportException
WARNING: Please report java.lang.NullPointerException at:

错误消息在这里结束,没有显示问题所在。

我的代码目录: pacman directory

我的 main.java:

package finalPacman;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader loader = new FXMLLoader(getClass().getResource("pacman.fxml"));
        Parent root = loader.load();
        primaryStage.setTitle("PacMan");
        Controller controller = loader.getController();
        root.setOnKeyPressed(controller);
        double sceneWidth = controller.getBoardWidth() + 20.0;
        double sceneHeight = controller.getBoardHeight() + 100.0;
        Scene scene = new Scene(root, sceneWidth, sceneHeight);
        scene.getStylesheets().clear();
        scene.getStylesheets().add(getClass().getResource("pacman.css").toExternalForm());
        primaryStage.setScene(scene);
        primaryStage.show();
        root.requestFocus();
    }

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

我的 pacman.css:

@font-face {
    font-family: 'Pixeboy';
    src: url("/src/res/fonts/Pixeboy.ttf");
}

.root{
    -fx-font-size: 16;
    -fx-font-family: "Pixeboy";
}

【问题讨论】:

  • 字体文件的路径显然是错误的。 (src 是源文件夹;它通常在运行时不可用)
  • 请遵守 java 命名约定(包名应全部小写)

标签: css javafx


【解决方案1】:

@font-face 可以工作,但是:

  1. 它需要在您的 CSS 文件中排在第一位。

  2. 不能在 src URL 中使用前导斜杠

  3. src URL 必须找到其中一个

    • 通过有效的完整 URL 的 Web 字体,例如http:https:file: 协议或
    • 要将其作为资源获取,它必须是包含 @font-face 指令的 CSS 文件的相对路径。

如果一切设置正确,则以下答案中的说明可以正常工作(使用 JavaFX 17 验证):

适用于问题中定义的资源的示例 URL 是相对于 CSS 文件的 src URL:

src: url("fonts/Pixeboy.ttf"); 

假设字体实际上位于引用 @font-face 的 CSS 文件的相对位置。

当我测试时,我使用了上面答案中链接的CSS and fonts

疑难解答

  1. 如果您在 @font-face 的 src URL 中使用前导斜杠(例如 src: url("/fonts/Pixeboy.ttf");),您将收到以下消息并且不会加载字体:

    Jan 12, 2022 2:31:09 PM javafx.css.CssParser reportException
    WARNING: Please report java.lang.NullPointerException at:
    

    将生成错误消息,即使从类/模块路径的根目录中定位字体文件的路径正确,字体也不会加载。

  2. 如果您为不存在的字体指定位置(例如src: url("wrongfoldername/Pixeboy.ttf");,您将收到以下错误消息并且字体不会加载:

    Jan 12, 2022 2:43:18 PM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
    INFO: Could not load @font-face font [file:/<build-output-dir>/wrongfoldername/Pixeboy.ttf]
    

【讨论】:

  • 我的字体路径是src/res/fonts/Pixeboy.tff,我的css路径现在是src/finalPacman/pacman.css,所以为了让它工作,我必须这样做:url("../res/fonts/Pixeboy.tff")。感谢您的详细回答和精彩的解释
猜你喜欢
  • 2015-07-04
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多