作为背景,我意识到 Stack Overflow 上还有大约 5 篇关于此的其他帖子,但我查看了回复并研究了无数小时,但没有真正的解决方案。否则我不会在这里发帖。
我是 JavaFX 的新手,我喜欢 Clojure,所以我使用 Github 的 chrisx 的 clj-javafx 项目作为 JavaFX 的 Clojure 包装器。大多数操作都很好用,例如将组件放置在场景/舞台上并使用 CSS 对其进行样式设置。只有一个问题:我想导入一种自定义字体,但到目前为止我还做不到。
我尝试了多种方法。我尝试的第一件事的Java版本是:
Font.loadFont(<myClass>.class.getResource("mpsesb.ttf").toExternalForm(), 14);
我尝试在 Clojure 中使用 Java 互操作来做到这一点,但我不确定 Clojure 如何处理 Java 类。相反,我使用了 clojure.java.io.resource:
(use '[clojure.java.io :only [resource]])
(resource "mpsesb.tff")
它可以很好地打印 .ttf 文件的 URL。然后我尝试使用该 URL 并将其用作 Font.loadFont 方法中的参数,但没有成功。在玩弄了 100 种点运算符和 Java 方法和类的排列之后,我得到了以下结果,不会打印任何错误,这与我尝试过的其他组合不同:
(Font/loadFont "fonts/ttf/mpsesb.ttf")
但它只返回 nil,根据 JavaFX API,这意味着字体实际上并未加载。我什至尝试了假路径名,它们也没有错误地返回 nil,所以 Font/loadFont 函数似乎没有我想象的那么有希望。
我终于尝试使用 CSS 来加载字体而不是使用 Java 来导入它:
@font-face {
font-family: 'MyrProSemiExtBold';
src: url('file:/Users/<restOfPath>/mpsesb.ttf');
}
.label {
-fx-font-size: 14px;
-fx-font-weight: normal;
-fx-font-family: 'MyrProSemiExtBold';
}
但没有运气。标签仅显示为 14 pt 的默认字体 (Lucida Grande)。
提前感谢您提出的任何建议。
编辑:
谢谢,@jewelsea。阅读您所写的内容后,我做的第一件事是获取 Java 8 + JDK 8(构建 b101)。我正在使用 Sublime Text,所以我让 SublimeREPL 在终端中使用 Maven 识别 JavaFX:
$ mvn deploy:deploy-file -DgroupId=local.oracle -DartifactId=javafxrt -Dversion=8.0 -Dpackaging=jar -Dfile=/System/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre/lib/ext/jfxrt.jar -Durl=file:/Users/vaniificat/.m2/repository
大多数 JavaFX 参考代码都可以工作,但现在整个 javafx.scene.control 包都不起作用,这意味着没有标签、没有按钮、没有 TextFields 等......:
> (import javafx.scene.control.Button)
: NoClassDefFoundError Could not initialize class javafx.scene.control.Button
java.lang.Class.forName0 (Class.java:-2)
> (import javafx.scene.control.Label)
: NoClassDefFoundError javafx.scene.control.Labeled
java.lang.Class.forName0 (Class.java:-2)
> (import javafx.scene.control.TextField)
: NoClassDefFoundError javafx.scene.control.Control
java.lang.Class.forName0 (Class.java:-2)
> (import '(javafx.scene.control Button Label PasswordField TextField))
: NoClassDefFoundError Could not initialize class javafx.scene.control.Button
java.lang.Class.forName0 (Class.java:-2)
可以在https://forums.oracle.com/thread/2526150找到对这些错误的可能参考。基本上要点是 JavaFX 8 仅处于测试阶段,所以我们不能指望它 100% 工作。唔!
我在 JIRA 上打开了一个问题:https ://bugs.openjdk.java.net/browse/JDK-8093894 。一旦这个问题得到解决,我就可以更充分地探索@jewelsea 的其他建议。