由于com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged,JavaFx无法加载@ font-face字体

Col*_*iza 10 java javafx java-8 javafx-2 javafx-8

我已经在这里问了一个类似的问题,但似乎不清楚,因为我在项目中有很多代码而无法在此处发布所以不要将其标记为重复.

因此,我决定创建一个新项目,其中只有一个标签,以使代码小而干净,并消除我得到的错误的其他潜在嫌疑人.

所以这是我的Java源代码

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        Group root = new Group();

        Label label = new Label("Sample Label");
        label.setId("sampleLabel");
        root.getChildren().add(label);

        Scene scene = new Scene(root, 300, 275);
        scene.getStylesheets().add(getClass().getResource("applicationStyles.css").toExternalForm());
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的css文件

/**/
@font-face {
    font-family:'Roboto';
    src:url("Roboto-Thin.ttf");
}
#sampleLabel{
    -fx-font-family: Roboto ;
}
Run Code Online (Sandbox Code Playgroud)

这是我在Intellij Idea中遇到的错误

Dec 02, 2015 9:16:34 AM com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged
INFO: Could not load @font-face font [file:/C:/Users/UserName/Desktop/Java8%20projects/TeamViewer/out/production/TeamViewer/sample/Roboto-Thin.ttf]
Run Code Online (Sandbox Code Playgroud)

所有项目文件都在一个包中,字体文件也出现在out> production> TeamViewer> sample> Roboto-Thin.ttf中.我也从jdk-8u65升级到jdk-8u66

谢谢,非常感谢任何帮助.

Ter*_*ahl 4

我找到了可能的原因和解决方法:在幕后,css-loader 使用该函数Font.loadFont来加载 CSS 中的字体。 Font.loadFont如果失败则简单地返回null,并给出“警告”。

看来这个函数不能与%20它的路径/url 字符串一起使用。所以需要解析路径,然后用空格替换。这意味着您必须使用代码而不是 CSS(目前)来加载字体。

在 Clojure 中我的解决方法如下所示:

(require '[clojure.java.io :as cio])
(require '[clojure.string :as s])
(-> "fonts/SourceCodePro-Regular.ttf" 
  cio/resource 
  str 
  (s/replace "%20" " ") 
  (javafx.scene.text.Font/loadFont  10.))
Run Code Online (Sandbox Code Playgroud)

;-)