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

由于com.sun.JavaFx.css.StyleManager loadStylesheetUnPrivileged,JavaFx无法加载@font-face字体,java,javafx,java-8,javafx-2,javafx-8,Java,Javafx,Java 8,Javafx 2,Javafx 8,我已经问了一个类似的问题,但似乎不清楚,因为我在项目中有很多代码,无法在这里发布,所以请不要标记为重复 正因为如此,我决定创建一个新项目,其中只包含一个标签,以使代码小而干净,并消除其他可能的错误嫌疑 下面是我的Java源代码 public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Group root =

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

正因为如此,我决定创建一个新项目,其中只包含一个标签,以使代码小而干净,并消除其他可能的错误嫌疑

下面是我的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);
    }
}
/**/
@font-face {
    font-family:'Roboto';
    src:url("Roboto-Thin.ttf");
}
#sampleLabel{
    -fx-font-family: Roboto ;
}
这是我的css文件

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);
    }
}
/**/
@font-face {
    font-family:'Roboto';
    src:url("Roboto-Thin.ttf");
}
#sampleLabel{
    -fx-font-family: Roboto ;
}
这就是我在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]
所有项目文件都在一个包中,字体文件也存在于out>production>TeamViewer>sample>Roboto-Thin.ttf中。我还从jdk-8u65升级到jdk-8u66

谢谢,非常感谢您的帮助。

我正在使用Eclipse的e(fx)clipse插件,它无法将您的CSS文件识别为有效的JavaFX CSS。当我启动程序时,我没有得到异常,但是,它只是使用默认字体

通过以下更改,将加载并显示字体

/**/
@font-face {
    font-family: Roboto; /* removed '' */
    src: url("Roboto-Thin.ttf");
}
#sampleLabel{
    -fx-font-family: Roboto ; /* added -fx- prefix */
}

我找到了可能的原因和解决方法: 在引擎盖下,css加载程序使用函数
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.))

;-)

所以,差不多2年后,我遇到了我自己对仍然存在的同样问题的反应

但是在研究了
com.sun.javafx.css.StyleManager
的源代码之后,现在我有了一个更酷、更优雅的解决方案:只需自己解析样式表并加载字体即可

请参见此处的相关源代码:

(是的,这一切都在Clojure中,但我相信你能弄明白。)

我从以下几点开始:

(定义添加样式表[^Scene-Scene-path]
(让[记录器(日志记录/getCSSLogger)
级别(.level logger)]
(.setLevel记录器平台记录器$Level/OFF);;关闭记录器
(->scene.getStylesheets(.add path));设置样式表
(.setLevel logger level);;重新打开记录器
(->路径样式表解析加载字体));;解析和加载字体
(出于某种原因,关闭日志记录不起作用)

样式表的解析方式如下:

(解析的defn样式表[path]
(.parse(CSSParser.)(cio/资源路径)))
最后,字体将加载以下内容:

(定义-加载字体[^Stylesheet Stylesheet]
(doseq[^FontFace FontFace(.getFontFaces样式表)]
(doseq[^FontFace$FontFaceSrc ffsrc(.getSources-FontFace)]

(让[src(->ffsrc.getSrc(cs/replace“%20”)));对于那些像我一样仍然存在这个问题并且不想或不知道如何使用Clojure的人,这里介绍了如何仅在Java中使用:

如果要将样式表添加到场景中,请使用
Font.loadFont(getClass().getResourceAsStream([fontpath…]),[某些字体大小,例如12])

然后字体将在JavaFX中注册,您可以对加载的字体使用
-fx字体系列
css属性。

在我的例子中,这是由字体文件名中的“-”字符生成的,用“\ux”替换它就可以了

我确定字体系列必须是相同的文件名,但替换所有特殊字符“”(空白),并拆分大小写单词

因此:

之前(不工作):

(工作)后:


您使用的是maven资源筛选吗?我刚刚遇到了同样的问题,它是由maven筛选引起的,因为我忘了将它们排除在筛选之外。@MajedAbdulaziz非常感谢您的回答,但我没有使用maven,我不认为这是我的问题的原因。与源文件和编译的类文件相关的是
Roboto Thin.ttf
是否定位?@hotzst如果将项目移动到另一个位置,而该位置没有包含空格的路径(
Java8%20projects
),则它们都位于同一文件夹
out>production>TeamViewer>sample>Main.class
out>production>TeamViewer>sample>Roboto Thin.ttf
)这有什么区别吗?如果你把应用程序打包成一个jar文件并运行它呢?谢谢你的回复,但我仍然收到同样的错误,也很抱歉我忘记了
-fx-
前缀,但我刚刚添加了它,可能是Intellij IDEA的问题。你有没有尝试过用普通的javac/java编译/运行它,而没有IDEust自己也尝试过,甚至你原来的CSS也可以这样工作。我想,甚至eclipse都可以工作,但我需要一个
IntelliJ Idea
的解决方案,它最初工作得很好,但突然停止了。我今天遇到了这个问题。即使几年后我可以添加我的代码。如果你使用Maven和IntelliJ Idea,我发现了helpful在导入字体文件后手动重新导入maven项目。在那之后,它起了作用。我通过删除空间来摆脱%20,解决了这个问题,但这也解决了问题。非常感谢+1