2012-03-25 35 views
45

Tôi gặp lỗi cho GUI của mình. Cố gắng thiết lập biểu tượng thanh tiêu đề sau đó được bao gồm trong một JAR Runnable.Đang tải tài nguyên hình ảnh

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

frame.setIconImage(image); 

Đây là lỗi Tôi nhận:

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) 

Những hình ảnh trong thư mục đúng mà "tài nguyên" thư mục là thư mục gốc của hồ sơ dự án

+2

tôi nghĩ rằng bạn cần một '/ 'trước các nguồn lực, kiểm tra xem hài lòng – Coffee

+2

@ Adel Cảm ơn vì điều đó. Tôi đang gặp lỗi khác. Ngoại lệ trong chuỗi "main" java.lang.IllegalArgumentException: input == null! Lỗi tương tự với thay đổi – exlux15

+3

Thử xóa .getClassLoader() –

Trả lời

56

Trước hết, thay đổi dòng này:

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

này:

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

Thông tin thêm, với tư cách đến nơi nằm chênh lệch giữa hai phương pháp, có thể được tìm thấy trên chủ đề này - Different ways of loading a Resource

Đối với Eclipse:

Đối với NetBeans:

Đối với IntelliJ IDE A:

  • Right-Click các src thư mục của dự án. Chọn New -> Gói
  • Dưới New Package Dialog, gõ tên của gói, nói nguồn. Nhấp vào OK
  • Phải Nhấp vào gói tài nguyên. Chọn New -> Gói
  • Dưới New Package Dialog, gõ tên của gói, nói hình ảnh. Bấm OK
  • Bây giờ hãy chọn hình ảnh mà bạn muốn thêm vào dự án, sao chép nó. Tài nguyên nhấp chuột phải.hình ảnh gói, bên trong IDEchọn Paste
  • Dùng đường dẫn cuối cùng để kiểm tra làm thế nào để truy cập vào tập tin này ngay bây giờ trong mã Java. Mặc dù ví dụ này, người ta sẽ được sử dụng

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

  • Nhấn phím Shift + F10, để thực hiện và điều hành dự án. Các tài nguyên và hình ảnh tài nguyên và hình ảnh thư mục, sẽ được tạo tự động bên trong thư mục ra.

Nếu bạn đang làm nó bằng tay:

QUICK REFERENCE mã ví dụ (mặc dù cho biết thêm chi tiết xem xét, Một chút liên kết thêm rõ):

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

Cảm ơn rất nhiều. Nó hoạt động hoàn hảo. Tôi đã sử dụng Eclipse. – exlux15

+0

@trashgod: Xin cảm ơn vì đã chỉnh sửa, nhưng tốt hơn nếu bạn thêm bản chỉnh sửa của mình lên trên mình, vì Tài liệu Java giải thích theo cách tốt hơn nhiều so với những gì tôi làm trong câu trả lời của tôi, có vẻ như:) –

+0

@ nIcEcOw: Thành thật mà nói, tôi nghĩ rằng nghệ thuật ASCII của bạn dễ đọc hơn. :-) – trashgod

6

Các tập tin hình ảnh phải nằm trong thư mục resources/ trong JAR của bạn, như được hiển thị trong How to Use Icons và số này example cho thư mục có tên images/.

5

Có một dễ dàng hơn nhiều cách để tải và cài đặt một hình ảnh như một biểu tượng khung :

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

Và đó là tất cả :)! Bạn thậm chí không phải sử dụng khối try-catch vì ImageIcon không ném bất kỳ ngoại lệ nào được khai báo. Và do getClass().getResource(), nó hoạt động cả từ hệ thống tệp và từ một cái lọ tùy thuộc vào cách bạn chạy ứng dụng của mình.

Nếu bạn cần phải kiểm tra xem các hình ảnh có sẵn, bạn có thể kiểm tra xem URL trả về bởi 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()); 
Các vấn đề liên quan