2012-08-28 15 views
7

मेरे पास माइप्रोजेक्ट नामक एक जावा प्रोजेक्ट है।एक अलग पैकेज में एक वर्ग से पैकेज के अंदर जावा छवि लोड करें

src/PackageA 
src/PackageA/PackageAa 
src/PackageA/PackageAa/PackageAaa 
src/PackageB 
src/PackageB/PackageBa 
src/PackageB/PackageBa/PackageBaa 

मैं एक वर्ग

src/PackageA/PackageAa/PackageAaa/MyJavaFile.java 

है और मैं एक छवि

src/PackageB/PackageBa/PackageBaa/MyImage.png 
है: इस प्रकार मैं, कुछ अलग पैकेज (नाम इस सवाल के प्रयोजन के लिए सरल रखने) है

MyJavaFile.java के अंदर, मैं MyImage.png

का एक चित्र निकालना चाहता हूं

मैं यह कैसे कर सकता हूं?

+1

प्रश्न: आप जावा पैकेज में .png संसाधन क्यों डाल रहे हैं ??? भले ही आप एक .jar फ़ाइल में सामान डालते हैं, फिर भी आपके पास संसाधनों के लिए एक अलग निर्देशिका होगी ("/ संसाधन" पॉप पसंदीदा होने के नाते)। उदाहरण के लिए: [जार में छवि जोड़ें] (http://stackoverflow.com/questions/1096398/add-image-to-jar-java)। पीएस: यह लिंक आपके विशिष्ट प्रश्न का उत्तर देता है ... लेकिन यदि संभव हो तो मैं इसके खिलाफ सलाह दूंगा। IMHO ... – paulsm4

+0

src/packageB/packageBa/PackageBaa/MyImage.png पैकेज फ़ोल्डर –

+0

छवि छवि = Toolkit.getDefaultToolkit() प्राप्त करें IMage ("Agent.gif"); – TechDog

उत्तर

10

आप या तो Class.getResource फोन और /, या ClassLoader.getResource के साथ शुरू एक पथ निर्दिष्ट और नहीं कर सकता / से परेशान:

URL resource = MyJavaFile.class 
     .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 

या:

URL resource = MyJavaFile.class.getClassLoader() 
     .getResource("PackageB/PackageBa/PackageBaa/MyImage.png"); 

मूल रूप से Class.getResource आपको कक्षा से संबंधित संसाधन निर्दिष्ट करने की अनुमति देगा, लेकिन मुझे नहीं लगता है, यह आपको निर्देशिका नेविगेशन के लिए ".." आदि का उपयोग करने की अनुमति देता है।

बेशक

, अगर आप सही पैकेज में एक वर्ग के बारे में पता, तुम बस का उपयोग कर सकते हैं:

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png"); 

(मैं यह सोचते करती हूं कि आप प्रश्न में Image निर्माता के लिए एक URL पारित कर सकते हैं वहाँ भी है getResourceAsStreamClass और ClassLoader दोनों पर।)

+0

मैं इस छवि से BufferedImage कैसे प्राप्त कर सकता हूं। – CodeGuy

+0

'ImageIO.read (URL)' का उपयोग करने का एक तरीका है। –

2

/folderB/folderBa/folderBaa/MyImage.png

छवि परियोजना फ़ोल्डर स्थान .eg में स्टोर कर सकते हैं: /images/MyImage.png

तो आप का उपयोग करने की कोशिश यह

Image img = new Image(/images/MyImage.png); 

एक जार फ़ाइल में प्रोग्राम चलाते समय एक फ़ाइल पथ संभव नहीं है, विशेष रूप से यदि प्रोग्राम को एप्लेट या वेबस्टार्ट एप्लिकेशन के रूप में लोड किया जा रहा है तो आप छवि प्राप्त करने के लिए क्लासलोडर का उपयोग कर सकते हैं।

छवियों को लोड करने के लिए निम्न कोड का उपयोग करें:

ClassLoader cldr = this.getClass().getClassLoader(); 

    java.net.URL imageURL = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png"); 
ImageIcon aceOfDiamonds = new ImageIcon(imageURL); 
+0

मैं सहमत हूं - "/ images" नामक निर्देशिका बनाना एक स्रोत फ़ोल्डर/जावा पैकेज में अपने .png को संग्रहीत करने से कहीं अधिक स्मार्ट, बेहतर अभ्यास है। IMHO ... – paulsm4

+0

मुझे छवि की आवश्यकता है, छवि आइकन नहीं। क्या मैं सिर्फ एक प्राप्त कर सकता हूं() – CodeGuy

+0

यह गलत है। मुझे एक शून्य सूचक मिलता है। और हाँ, पथ बिल्कुल सही है। – CodeGuy

0

src रूट के अंदर संसाधनों को पढ़ने के लिए getResource विधि का उपयोग करें। उदाहरण के लिए, निम्न कोड किसी फ़ोल्डर src/images से छवियों को पुनर्प्राप्त करता है।

// Get current classloader 
ClassLoader cl = this.getClass().getClassLoader(); 
// Create icons 
Icon saveIcon = new ImageIcon(cl.getResource("images/save.gif")); 
Icon cutIcon = new ImageIcon(cl.getResource("images/cut.gif")); 

उदाहरण मानता है कि निम्न प्रविष्टियां आवेदन के JAR फ़ाइल में मौजूद है:

images/save.gif 
images/cut.gif 
1

यह सबसे अच्छा तरीका है एक जार अनुप्रयोग में सभी छवियों और आइकनों को संभालने के लिए है।

एक बार जब आप अपनी सभी छवियों और आइकनों को अपनी जेएआर फ़ाइल में ज़िप कर लेते हैं - छवियों JAR फ़ाइल को अपने पुस्तकालय टैब में जोड़कर अपने निर्माण पथ को कॉन्फ़िगर करें ताकि अब यह आपके क्लासपाथ में शामिल हो।

तो बस किसी भी चित्र SystemTray छवि है जो सरल ImageIcon के स्वीकार नहीं करता है उसके मुख्य चिह्न के रूप में (अजीब मुझे पता है) सहित कुछ भी के लिए की जरूरत पहुंचने के लिए अपने constuctor के शुरू में कोड के निम्नलिखित 3x लाइनों का प्रयोग । 3x पंक्तियां हैं: एक ही समय में

setIconImage(imageIcon); 

और:

URL iconUrl = this.getClass().getResource("/image-iconb.png"); 
    Toolkit tk = this.getToolkit(); 
    imageIcon = tk.getImage(iconUrl); 

अब आप एक खिड़की आइकन सेट कर सकते हैं के रूप में के रूप में बस (IMAGE आइकन सिर्फ एक निर्माता घोषित छवि चर रहा है) सिस्टम ट्रेएकॉन को घोषित करके उसी वैरिएबल का उपयोग करें:

trayIcon = new TrayIcon(imageIcon, "SystemTray Demo", popupMenu); 

उपर्युक्त छवियों को सही जगह पर रखने के जोखिम को चलाने के बिना आपको छवियों या छवियों को आसानी से और केंद्रीय रूप से घोषित करने की अनुमति देता है। यह जार के साथ अच्छा और साफ रखता है, जिसमें आपकी सभी छवियां स्वचालित रूप से आपके प्रोग्राम के रन टाइम और वितरण पर संकलित होती हैं।

एक बोनस के रूप में, एक बार JAR अपने classpath में पंजीकृत है - आप भी किसी भी उपद्रव के बिना किसी भी समय में एक ही जार में किसी भी अन्य चित्र जोड़कर रख सकते - सब कुछ बस काम करता है और कहा कि छवियों तुरन्त के लिए उपलब्ध हैं अपने एप्लिकेशन।

मेरे विचार में बहुत बेहतर है।

3

आप रिश्तेदार पथ का उपयोग कर सकते हैं क्योंकि सापेक्ष पथ प्रोजेक्ट फ़ोल्डर है।

ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png"); 
संबंधित मुद्दे