我已经问了一个类似的问题here,但似乎它不清楚,因为我有很多的代码在项目中,不能张贴在这里,所以请不要标记为重复。
因此,我决定创建一个新项目,其中只有一个Label,以使代码小而干净,并消除其他潜在的错误嫌疑人。
这是我的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);
}
}
这是我的css文件
/**/
@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-8 U65升级到了JDK-8 U66
谢谢,任何帮助都非常感谢。
6条答案
按热度按时间jfgube3f1#
我找到了可能的原因和解决方法:css-loader使用函数
Font.loadFont
在CSS中加载font-face。如果失败,Font.loadFont
简单地返回null
,给予“警告”。这个函数似乎不适用于
%20
路径/url-string。因此,您需要解析路径,然后将其替换为空格。这意味着你将不得不用代码而不是CSS来加载你的字体(现在)。在Clojure中,我的解决方法看起来像这样:
;-)
odopli942#
我使用的是Eclipse的e(fx)clipse插件,它不能将CSS文件识别为有效的JavaFX CSS。当我启动程序时,我没有得到异常,但是,它只是使用默认字体。
通过以下更改,将加载并显示字体。
enyaitl33#
所以,差不多两年后,我遇到了我自己的React,同样的问题,我仍然有。
但是现在我有了一个更酷、更优雅的解决方案,在研究了
com.sun.javafx.css.StyleManager
的源代码之后:只需自己解析样式表并加载字体。相关源代码请看这里:第932-662行
(Yes,这都是在Clojure中实现的,但我相信你能弄清楚。)
我从这个开始:
(由于某种原因,关闭日志记录不起作用)。
样式表的解析如下:
最后,字体加载如下:
这个工作得很好,看起来很像原来的。一个优点是,在这里我们不检查类型URL,所以我们理论上可以扩展它来更广泛地处理@font-face。
下面是
load-fonts
的一个更加Clojure-y的实现,它返回加载的所有字体的列表:所需进口:
待办事项:
1.转向伐木。(这很烦人,尽管只是开发中的一个问题。)
2.测试是否有字体未加载,然后才进行替代解析和加载。但是,可能简单的检查将需要与实际加载字体一样多的处理时间。
修复:在
flatten
的左侧添加了vec
,以确保实现惰性序列。1sbrub3j4#
在我的例子中,这是由字体文件名中的“-”字符产生的,用“_”替换它,它就可以工作了。
我确定字体系列必须是相同的文件名,但替换所有特殊字符' '(一个空格)并拆分驼峰大小写单词。
所以:
之前(不工作):
工作(Working):
new9mtju5#
对于那些像我一样仍然有这个问题并且不想或不知道如何使用Clojure的人,这里是如何在Java中做到这一点:
在向场景中添加样式表之前,请使用
Font.loadFont(getClass().getResourceAsStream([fontpath...]), [Some font-size, for example 12]);
然后字体将在JavaFX中注册,您可以将
-fx-font-family
css-Property用于加载的字体。11dmarpk6#
我在Reddit上找到了一个适合我的解决方案。这里是链接:Reddit post
在CSS样式表中定义字体系列时,请确保使用字体文件第一行中提到的确切名称。
例如,如果第一行显示“Pixeloid Sans”,则字体系列应指定如下:
-fx-font-family: "Pixeloid Sans";
我还删除了
@font-face
声明,因为它是不必要的。最后,我应该提到我所有的.tff文件都位于/resources中的一个文件夹中。