2015-12-02 13 views
10

के कारण @ font-face फ़ॉन्ट लोड नहीं हो सका, मैंने पहले से ही इसी तरह के प्रश्न here से पूछा था लेकिन ऐसा लगता है कि यह स्पष्ट नहीं था क्योंकि मेरे पास प्रोजेक्ट में बहुत अधिक कोड था और इसे यहां पोस्ट नहीं कर सका तो कृपया डुप्लिकेट के रूप में चिह्नित न करें।JavaFx com.sun.javafx.css.StyleManager loadStylesheetUnPrivileged

इस कारण से

, मैं तो अन्य संभावित संदिग्धों त्रुटि मैं हो रही है की खत्म करने के लिए उस में सिर्फ एक लेबल के साथ एक नई परियोजना बनाने कोड छोटे और स्वच्छ बनाने के लिए और भी करने का फैसला किया।

तो यहाँ

मेरी जावा स्रोत कोड

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 विचार में हो रही है

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] 

सभी प्रोजेक्ट फ़ाइलें एक पैकेज में हैं और फ़ॉन्ट फ़ाइल आउट> उत्पादन> टीम व्यूअर> नमूना> रोबोटो-थिन.एटीएफ में भी मौजूद है। मैंने jdk-8u65 से jdk-8u66

धन्यवाद, किसी भी मदद की बहुत सराहना की गई है।

+0

क्या आप मेवेन संसाधन फ़िल्टरिंग का उपयोग कर रहे हैं? मैंने अभी भी एक ही समस्या का सामना किया है और यह मैवेन फ़िल्टरिंग के कारण होता है, क्योंकि मैं उन्हें फ़िल्टरिंग से बाहर करना भूल गया था। –

+0

@MajedAbdulaziz उत्तर के लिए बहुत बहुत धन्यवाद, लेकिन मैं मैवेन का उपयोग नहीं कर रहा हूं, मुझे नहीं लगता कि यह मेरे मामले में कारण है। –

+0

आपकी स्रोत फ़ाइल के संबंध में और संकलित वर्ग फ़ाइल 'Roboto-Thin.ttf' स्थित है? – hotzst

उत्तर

2

मैं संभावित कारण और एक काम के आसपास पाया। Font.loadFont अगर यह विफल रहता है, तो null लौटाता है, जो "चेतावनी" देता है।

ऐसा लगता है कि यह फ़ंक्शन %20 के साथ यह पथ/url-string के साथ काम नहीं करता है। तो आपको पथ को हल करने की आवश्यकता है और फिर इसे किसी स्थान से प्रतिस्थापित करें। इसका मतलब है कि आपको अपने फोंट को कोड के साथ सीएसएस (अब के लिए) के साथ लोड करना होगा।

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.)) 

;-)

+1

मैंने% 20 से छुटकारा पाने के लिए बस जगह को हटाकर हल किया था, लेकिन यह समस्या हल करता है। बहुत बहुत धन्यवाद +1 –

1

मैं ईक्लीप्स के लिए ई (एफएक्स) क्लिपसे प्लगइन का उपयोग कर रहा हूं, जो आपकी सीएसएस फ़ाइल को मान्य जावाएफएक्स सीएसएस के रूप में नहीं पहचानता है। जब मैं प्रोग्राम शुरू करता हूं तो मुझे अपवाद नहीं मिलता है, लेकिन यह केवल डिफ़ॉल्ट फ़ॉन्ट का उपयोग करता है।

निम्नलिखित परिवर्तनों के साथ, फ़ॉन्ट लोड और प्रदर्शित किया जा रहा है। हुड सीएसएस-लोडर समारोह Font.loadFont का उपयोग करता है अपने सीएसएस में फॉन्ट-फेस लोड करने के लिए के तहत:

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

उत्तर के लिए धन्यवाद, लेकिन मुझे अभी भी एक ही त्रुटि मिल रही है, मुझे खेद है कि मैं '-fx -' उपसर्ग भूल गया था लेकिन मैंने इसे अभी जोड़ा है –

+0

समस्या हो सकती है इंटेलिज आइडिया –

+0

क्या आपने इसे संकलित/चलाने की कोशिश की है सादा जावैक/जावा के साथ, आईडीई के बिना? बस इसे स्वयं करने की कोशिश की और यहां तक ​​कि आपका मूल सीएसएस इस तरह से ठीक काम करता है। – Prometheus

1

तो, लगभग 2 साल बाद, और मैं एक ही समस्या मैं अभी भी करने के लिए अपने ही प्रतिक्रिया बारे में जाना।

लेकिन अब मेरे पास com.sun.javafx.css.StyleManager के लिए स्रोत कोड का अध्ययन करने के बाद एक कूलर और अधिक सुरुचिपूर्ण समाधान है: केवल स्टाइलशीट को पार्स करें और फोंट लोड करें।

यहाँ प्रासंगिक स्रोत कोड देखें: lines 932-662

(। हाँ, यह सब Clojure में है, लेकिन मुझे यकीन है कि आप यह पता लगा सकते हैं कर रहा हूँ)

मैं इस के साथ शुरू:

(defn add-stylesheet [^Scene scene path] 
    (let [logger (Logging/getCSSLogger) 
     level (.level logger)] 
    (.setLevel logger PlatformLogger$Level/OFF) ;; turn off logger 
    (-> scene .getStylesheets (.add path)) ;; set stylesheet 
    (.setLevel logger level) ;; turn logger back on 
    (-> path stylesheet-parsed load-fonts))) ;; parse and load fonts 

(कुछ कारणों से लॉगिंग बंद करना काम नहीं करता है)।

स्टाइलशीट इस के साथ पार्स किया गया है:

(defn stylesheet-parsed [path] 
    (.parse (CSSParser.) (cio/resource path))) 

और अंत में फोंट इस के साथ लोड किए गए हैं:

(defn- load-fonts [^Stylesheet stylesheet] 
    (doseq [^FontFace fontface (.getFontFaces stylesheet)] 
    (doseq [^FontFace$FontFaceSrc ffsrc (.getSources fontface)] 
     (let [src (-> ffsrc .getSrc (cs/replace "%20" " "))] ;; <- sanitizing path for Font/getFont 
     (println "Loading font:" src) 
     (let [f (Font/loadFont src 10.)] 
      (println "Font loaded:" f)))))) 

यह सिर्फ ठीक काम करता है, और मूल की तरह एक बहुत लग रहा है। एक फायदा यह है कि यहां हम केवल प्रकार के यूआरएल की जांच नहीं करते हैं, इसलिए हम इसे सैद्धांतिक रूप से @ फ़ॉन्ट-फेस को अधिक व्यापक रूप से संभालने के लिए बढ़ा सकते हैं।

यहाँ जो लोड सभी फ़ॉन्ट की सूची लौटाता है load-fonts का एक और अधिक Clojure-y दिया गया है:

(defn- load-fontface-src [^FontFace$FontFaceSrc ffsrc] 
    (-> ffsrc .getSrc (cs/replace "%20" " ") (Font/loadFont 10.))) 

(defn- load-fontface [^FontFace ff] 
    (map load-fontface-src (.getSources ff))) 

(defn- load-fonts [^Stylesheet stylesheet] 
    (vec (flatten (map load-fontface (.getFontFaces stylesheet))))) 

और आयात की जरूरत:

(import 
    '[com.sun.javafx.css.parser CSSParser] 
    '[com.sun.javafx.css Stylesheet FontFace FontFace$FontFaceSrc] 
    '[com.sun.javafx.util Logging] 
    '[sun.util.logging PlatformLogger$Level]) 

कार्यसूची:
1. की बारी लॉगिंग। (यह परेशान है, हालांकि विकास में केवल एक समस्या है।)
2. यह देखने के लिए परीक्षण करें कि क्या कोई फोंट लोड नहीं किया गया था, और केवल तभी वैकल्पिक पार्सिंग और लोडिंग के लिए। लेकिन संभवतः बस जांच के लिए अधिक प्रोसेसिंग की आवश्यकता होगी क्योंकि वास्तव में फोंट को अतिरिक्त समय लोड करना होगा।

FIX: के बाईं ओर vec जोड़ा गया ताकि यह सुनिश्चित किया जा सके कि आलसी seqs महसूस हो रहे हैं।