作爲背景,我意識到在Stack Overflow上大約有5篇關於此的文章,bur我查看了這些響應,並且在無數個小時內研究了這些並沒有真正的解決方案。否則我不會在這裏發佈。在JavaFX + Clojure中加載自定義字體
我是JavaFX的新手,我喜歡Clojure,所以我使用Github上的chrisx的clj-javafx項目作爲JavaFX的Clojure包裝器。大多數操作都很好,例如將組件放置在場景/舞臺上並使用CSS對其進行樣式設置。只有一個問題:我想導入自定義字體,到目前爲止我還沒有辦法。
我試過多種方法。的第一件事Java版本我試過是:
Font.loadFont(<myClass>.class.getResource("mpsesb.ttf").toExternalForm(), 14);
我試圖使用Java的互操作做,在Clojure的,但我不知道的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意味着字體沒有實際加載。我甚至嘗試假路徑名,他們也沒有錯誤返回零,所以字體/ 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點處顯示爲默認字體(Lucida Grande)。
非常感謝您提供任何建議。
編輯:
謝謝,@ jewelsea。讀完你寫的東西后,我做的第一件事就是獲得Java 8 + JDK 8(build b101)。我使用的是崇高的文本,所以我就SublimeREPL JavaFX的使用Maven像這樣在終端識別:
$ 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軟件包不工作,這意味着沒有標籤,沒有按鈕,沒有的TextField,等...:
> (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的其他建議。
對於Java 8,JavaFX類位於標準默認類路徑中,因此它們不應導入到Maven存儲庫中。我不知道SublimeREPL是如何工作的,但我認爲只要它使用Java 8 JRE啓動,它就能夠自動查找JavaFX類。您鏈接的論壇帖子與您未遇到的課程無關。 Java8是早期訪問,但基本上都是功能性的 - 像創建按鈕這樣的基本功能沒有問題。您可能希望創建一個單獨的StackOverflow問題,讓JavaFX 8能夠與Clojure一起使用。 – jewelsea