2012-03-25 31 views
45

मुझे अपने जीयूआई के लिए त्रुटि है। टाइटल बार आइकन सेट करने का प्रयास कर एक रननेबल जार में शामिल किया जाना चाहिए।छवि संसाधन लोड हो रहा है

BufferedImage image = null; 
try { 
    image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif")); 
} 
catch (IOException e) { 
    e.printStackTrace(); 
} 

frame.setIconImage(image); 

यहाँ त्रुटि मैं हो रही है:

Exception in thread "main" java.lang.IllegalArgumentException: input == null! 
    at javax.imageio.ImageIO.read(Unknown Source) 
    at GUI.<init>(GUI.java:39) 
    at GUI.main(GUI.java:351) 

छवि सही निर्देशिका जो "संसाधन" फ़ोल्डर प्रोजेक्ट फाइल

+2

मुझे तुम्हारी जरूरत है एक '/' संसाधनों के सामने, जाँच करें कि कृपया – Coffee

+2

लगता है @Adel इसके लिए धन्यवाद। मुझे एक और त्रुटि मिल रही है। थ्रेड में अपवाद "मुख्य" java.lang.IleglegalArgumentException: इनपुट == शून्य! – exlux15

+3

परिवर्तन के साथ वही त्रुटि हटाएं .getClassLoader() –

उत्तर

56

सबसे पहले, इस लाइन को बदलने इस सूत्र - Different ways of loading a Resource

ग्रहण के लिए:

NetBeans के लिए:

इंटेलीजे आईडीई के लिए एक:

  • राइट-क्लिक करें परियोजना केsrc फ़ोल्डर। का चयन करें नई -> पैकेज
  • तहत नए पैकेज संवाद, पैकेज के प्रकार के नाम का कहना है संसाधनों। ठीक है
  • दाएं संसाधन पैकेज पर क्लिक करें। का चयन करें नई -> पैकेज
  • तहत नए पैकेज संवाद, पैकेज के प्रकार के नाम का कहना है छवियों। ठीक है
  • अब उस छवि का चयन करें जिसे आप प्रोजेक्ट में जोड़ना चाहते हैं, इसे कॉपी करें। संसाधनों पर राइट क्लिक करें।छवियों पैकेज, आईडीई, और पेस्ट करें चुनें आखिरी कड़ी
  • उपयोग अंदर जावा कोड में अब इस फ़ाइल को एक्सेस करने के लिए कैसे की जाँच करने के। हालांकि इस उदाहरण के लिए, एक

    getClass().getResource("/resources/images/myImage.imageExtension");

  • का उपयोग कर किया जाएगा प्रेस + F10 शिफ्ट , बनाने के लिए और परियोजना को चलाने के लिए। संसाधनों और छवियों फोल्डर, बाहर फ़ोल्डर के अंदर स्वचालित रूप से बनाया जाएगा।

आप इसे मैन्युअल कर रहे हैं:

त्वरित संदर्भ कोड उदाहरण (हालांकि अधिक विस्तार के लिए विचार, एक छोटी सी अतिरिक्त स्पष्टीकरण लिंक):

package swingtest; 

import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

/** 
* Created with IntelliJ IDEA. 
* User: Gagandeep Bali 
* Date: 7/1/14 
* Time: 9:44 AM 
* To change this template use File | Settings | File Templates. 
*/ 
public class ImageExample { 

    private MyPanel contentPane; 

    private void displayGUI() { 
     JFrame frame = new JFrame("Image Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     contentPane = new MyPanel(); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    private class MyPanel extends JPanel { 

     private BufferedImage image; 

     public MyPanel() { 
      try { 
       image = ImageIO.read(MyPanel.class.getResource("/resources/images/planetbackground.jpg")); 
      } catch (IOException ioe) { 
       ioe.printStackTrace(); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return image == null ? new Dimension(400, 300): new Dimension(image.getWidth(), image.getHeight()); 
     } 

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      g.drawImage(image, 0, 0, this); 
     } 
    } 

    public static void main(String[] args) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       new ImageExample().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(runnable); 
    } 
} 
+1

बहुत बहुत धन्यवाद। यह पूरी तरह से काम किया। मैं ग्रहण का उपयोग कर रहा था। – exlux15

+0

@trashgod: thankx संपादन के लिए है, लेकिन बेहतर यह, हो सकता है अगर आप मेरा के शीर्ष पर अपने संपादित करें, क्योंकि जावा डॉक्टर ने बताया कि की तुलना में काफी बेहतर तरीके से, क्या मैं अपने जवाब में किया था, यह की तरह लगता है: -) –

+0

@nIcEcOw: ईमानदारी से, मुझे लगता है कि आपकी ASCII कला अधिक सुगम है। :-) – trashgod

6

छवि फ़ाइलों को चाहिए की जड़ है में है How to Use Icons में दिखाए गए अनुसार 10 में निर्देशिका के लिए resources/ निर्देशिका में रहें, और images/ नाम की निर्देशिका के लिए यह example है। ,

image = ImageIO.read(getClass().getResource("/resources/icon.gif")); 

अधिक जानकारी पर है, जहां दो दृष्टिकोण के बीच का अंतर है के रूप में, पर पाया जा सकता:

image = ImageIO.read(getClass().getClassLoader().getResource("resources/icon.gif")); 
इस के लिए

:

5

एक बहुत ही आसान तरीका लोड और एक फ्रेम चिह्न के रूप में एक छवि स्थापित करने के लिए नहीं है :

frame.setIconImage(
    new ImageIcon(getClass().getResource("/resources/icon.gif")).getImage()); 

और यह सब :) :) आपको ट्राई-कैच ब्लॉक का उपयोग भी नहीं करना है क्योंकि ImageIcon किसी घोषित अपवाद को फेंक नहीं देता है। और getClass().getResource() के कारण, यह आपके सिस्टम को चलाने के तरीके के आधार पर फ़ाइल सिस्टम और एक जार से दोनों काम करता है।

आप क्या छवि उपलब्ध है जांच करने की जरूरत है, तो आप देख सकते हैं कि यूआरएल getResource() द्वारा दिया null है:

URL url = getClass().getResource("/resources/icon.gif"); 
if (url == null) 
    System.out.println("Could not find image!"); 
else 
    frame.setIconImage(new ImageIcon(url).getImage()); 
संबंधित मुद्दे