当前位置: 首页 > 知识库问答 >
问题:

在JavaFX+Clojure中加载自定义字体

岳硕
2023-03-14

作为背景,我意识到还有大约5个关于堆栈溢出的帖子,但是我已经看了无数个小时的回应和研究了这个问题,没有真正的解决方案。否则我就不会在这里发帖了。

我是JavaFX的新手,我喜欢Clojure,所以我使用来自Github的ChrisX的clj-javafx项目作为JavaFX的Clojure包装器。大多数操作都工作得很好,比如在场景/舞台上放置组件,并用CSS对它们进行样式化。只有一个问题:我想导入一个自定义字体,但到目前为止我还不能。

Font.loadFont(<myClass>.class.getResource("mpsesb.ttf").toExternalForm(), 14);

我试图在Clojure中使用Java interop来实现这一点,但我不确定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';
}

但运气不好。标签只是在14pt显示为默认字体(Lucida Grande)。

$ 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/l‌​ib/ext/jfxrt.jar -Durl=file:/Users/vaniificat/.m2/repository
> (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找到对这些错误的可能引用。基本上,要点是JavaFX8只是在测试版,所以我们不能指望它100%工作。嗯!

我在JIRA上发现了一个问题:https://bugs.openjdk.java.net/browse/jdk-8093894。一旦这个问题得到解决,我可以更全面地探索@Jewelsea的其他建议。

共有1个答案

锺离嘉茂
2023-03-14

这些大多是建议,而不是明确的解决办法

在@font-face上

如果可以,请使用Java8。它支持@font-face css表示法(JavaFX的早期版本(如2.2)不支持这一点)。它还有一个改进的字体系统,可能会更健壮一点。因为在Java8中可以通过css加载字体面,所以您可能不需要解决与类位置相关的加载资源问题。

在font.loadfont上

您应该能够在尝试使用font.loadfont方法时使用它。JavaFX2.x从最初的版本开始就支持自定义字体。在普通Java中有一些在JavaFX中加载字体的步骤:如何嵌入。ttf字体是JavaFX2.2?。我知道您已经看过了,但它没有帮助--只是在这里包括它作为参考,以便真正了解clojure但不了解JavaFX的人可能会帮助解决这个问题。

检查目标字体是否兼容

我也不知道在clojure中加载相关资源是如何工作的(或者您的代码可能有其他问题)--但也许clojure专家可以发布另一个允许它工作的答案。您可能希望编辑您的问题以包含SSCE。

 类似资料:
  • 好吧,这变得有点复杂,涉及到所有不同的节点。如有可能,请随时提供简化建议。 我试图用自定义对象填充JavaFXListView,并用自定义节点格式化。 我有一个名为Contact的自定义对象,它的定义如下: 下面是我希望ListView中的每个联系人显示为的示例。 此自定义节点(ContactCell)由一个VBox根节点(顶部有一个用于联系人姓名的标签)和一个用于堆叠两部电话的VBox以及一个用

  • Clojure/Leiningen/Eclipse(和Java)newby。我试图让Eclipse加载Clojure/Leiningen项目,但在搜索Lein插件解决方案时,我看到了令人困惑/矛盾的结果。 Eclipse IDE for Java开发者版本:Juno Service Release 2构建id:20130225-0426(Windows 8) 我在中有以下用户配置文件。lein\p

  • 我的Spring启动应用程序有问题。它似乎不加载自定义css文件。我把它放在资源/静态/css下,我也尝试过在资源/公共/css下,但它也不起作用。 我把我的项目留在git hub帐户上,这样你就可以检查出什么问题了。 GitHub项目 另外,当我打开chrome控制台下的登录页面时,会出现一个警告 资源被解释为样式表,但使用 MIME 类型文本/纯文本传输:“http://localhost:8

  • 我正在使用Controlsfx库,特别是它的通知组件,但是它的默认CSS样式根本不适合我的应用程序样式,所以我正在尝试更改它。 我尝试使用这篇文章中提供的解决方案有没有办法更改内置的Controlfx通知弹出颜色? 因此: CSS文件正在成功加载,将其添加到styleSheets也没有错误,但是通知的样式保持不变。我尝试将整个文件(除了我的更改)加载到库中使用的文件和简短的css文件中,仅加载我想

  • 我在JavaFX中创建了一个自定义进度条。现在我想在progressBar中添加光晕效果。 为此,我创建了一个具有高斯模糊效果的椭圆,并将椭圆的中心线添加到时间轴中,以便在进度栏中设置辉光效果的动画。 这是创建椭圆的代码 这是制作动画的方法 虽然我已经将width属性与custom bar width属性绑定在一起,这样椭圆中心不会超过进度条的当前进度,并且应该反向。但当动画开始时,它不会发生,它

  • 我正在尝试创建一个自定义标签类型,该类型将包含一个“淡出”函数。这用于显示将闪烁然后隐藏的消息。 我正在使用Eclipse、SceneBuilder和Javafx。我不知道该怎么做,也不知道是否可能,但到目前为止,我已经做到了: 这显然行不通。 这是我第一次在一个文件中处理凌乱的代码(因此,我尝试将代码从版本1拉入一个新的“对象”,我可以在多个类中使用它): 如果您有任何建议或帮助,我们将不胜感激