2013-10-26 8 views
18

मैं एक javafx जीयूआई अनुप्रयोग बना रहा हूं और मेरी परियोजना एक मेवेन कॉन्फ़िगर किया गया प्रोजेक्ट है।संसाधन फ़ोल्डर में javafx fxml फ़ाइलों का संदर्भ कैसे लें?

FXMLLoader.load(getClass().getResource("main.fxml"); 

मेरे main.fxml फ़ाइल src/मुख्य/संसाधन फ़ोल्डर में स्थित है और मेरे नियंत्रक src/मुख्य/जावा में है: मैं अपने नियंत्रकों में इस तरह मेरी fxml फ़ाइलों को संदर्भित करने में सक्षम होना चाहते फ़ोल्डर। मैं यह कार्य कैसे करूं? मेरा src/main/संसाधन फ़ोल्डर बिल्ड पथ में है और मैं src/main/java फ़ोल्डर में किसी वर्ग से src/main/संसाधन फ़ोल्डर में एक .properties फ़ाइल को कॉल करने में सक्षम हूं।

संपादित

मैं मुख्य संसाधन फ़ोल्डर की इसी निर्देशिका में fxml फ़ाइल करने का प्रयास किया:

enter image description here

लेकिन मैं अभी भी त्रुटि मिल गया।

उत्तर

57

उदाहरण उपयोग

FXMLLoader loader = new FXMLLoader(); 
loader.setLocation(getClass().getResource("/main.fxml")); 
Parent content = loader.load(); 

स्थान संकल्प विकल्पों

  1. src/मुख्य/संसाधन निर्देशिका में अपने fxml के सभी रखो।

    loader.setLocation(getClass().getResource("/main.fxml")); 
    
  2. एक src/मुख्य/संसाधन/fxml निर्देशिका में अपने fxml के सभी रखो।

    loader.setLocation(getClass().getResource("/fxml/main.fxml")); 
    
  3. संबंधित संसाधन निर्देशिका में fxml रखें; जैसे src/मुख्य/संसाधन/com/mycompany/MyApp।

    loader.setLocation(getClass().getResource("main.fxml")); 
    

अंतिम विकल्प मानता है कि वर्ग है जिसमें से आप fxml लोड कर रहे हैं इसी जावा स्रोत पदानुक्रम में एक ही रिश्तेदार स्थान में है। उदाहरण के लिए, आप स्रोत com.mycompany.myapp.Main.java से अंतिम लोड कमांड का आह्वान कर सकते हैं।

FXMLLoader उपयोग सिफारिशों

  1. बल्कि static methods on the FXMLLoader का उपयोग करने से new FXMLLoader() के माध्यम से एक FXMLLoader इन्स्तांत।

    • स्थिर तरीकों जब आप एक लोडर से बाहर get values को (instantiated नियंत्रकों की तरह) चाहते भ्रमित हो जाते हैं।
  2. instantiated FXMLLoader पर Set the location और load() बजाय load(stream) का उपयोग कर एक धारा से लोड हो रहा है कहते हैं।

    • लोडर पर एक URL आधारित स्थान स्थापना रिश्तेदार fxml और सीएसएस फ़ाइलों में लोड संसाधनों के समाधान के लिए अनुमति देता है। सापेक्ष संसाधन स्ट्रीम आधारित निर्माता के लिए हल नहीं करते हैं।
  3. एक वर्ग के आधार पर स्थान प्राप्त करने के लिए, getClass().getResource() उपयोग करते हैं, के रूप में यह यूआरएल आधारित है, बजाय getClass().getResourceAsStream() जो आधारित धारा है।

आईडीई और बिल्ड सेटिंग

सुनिश्चित करें कि आपका आईडीई या निर्माण उपकरण निर्माण उत्पादन निर्देशिका के लिए संसाधन निर्देशिका से fxml फाइलों को कॉपी कर रहा है। इसके लिए इंटेलिज सेटिंग्स को समझने के लिए, देखें: How to convert a normal java project in intellij into a JavaFx project

+0

आप अभी भी अपने उदाहरण में स्थिर विधि का उपयोग कर रहे हैं। आपको GetResource –

+2

के बजाय getResourceAsStream को कॉल करने की आवश्यकता है धन्यवाद फेलिक्स, उत्तर को निश्चित और स्पष्ट किया गया है। 3 साल और 28 अपवॉट्स और किसी ने भी मूल जवाब में इस विसंगति को इंगित नहीं किया था ;-) – jewelsea

+0

इस बार, यह असफल रहा क्योंकि मैंने प्रारंभ फ़ोल्डर से पहले '/' नहीं रखा था। अर्थात। 'GetClass()। GetResource (" fxml/main.fxml ")'। – sudoman

4

आप अपना मुख्य.एफक्सएमएल लोड करने के लिए FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("main.fxml")); का उपयोग कर रहे हैं। इसके लिए main.fxml और जावा क्लास को उसी निर्देशिका/पथ में लोड करने की आवश्यकता होती है। यदि आप जावा वर्ग लोडिंग से अलग पथ/स्थान से एक fxml फ़ाइल लोड करना चाहते हैं, तो आपको सापेक्ष पथ का उपयोग करने की आवश्यकता है। ऊपर उल्लिखित @jewelsea के रूप में, आप अपने main.fxml से पहले/चरित्र का उपयोग कर सापेक्ष पथ का उपयोग कर सकते हैं। तो कोड यह आपके मामले में आप के लिए काम कर देगा कि

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/main.fxml")); 
0

आपके ऑपरेशन सिस्टम की फ़ाइल एक्सप्लोरर में अपने संसाधनों फ़ोल्डर खोलें है। यहां आप देखेंगे कि आपने "प्रभुत्व" फ़ोल्डर के अंदर "एप्लिकेशन" फ़ोल्डर के बजाय "dominion.application" फ़ोल्डर बनाया है। इस वजह से "मेनकंट्रोलर" वर्ग को एक अलग पैकेज में fxml फ़ाइल के रूप में रखा गया है।

संबंधित मुद्दे