2008-08-27 74 views
42

Khi chạy một ứng dụng Java từ nhật thực, ImageIcon của tôi chỉ hiển thị tốt.Java Swing: Hiển thị hình ảnh từ trong một Jar

Nhưng sau khi tạo hình chữ nhật, đường dẫn đến hình ảnh rõ ràng sẽ bị hỏng.

Có cách nào để trích xuất hình ảnh từ bình lúc chạy để tôi có thể mở nó ra không? Hoặc là có một cách tốt hơn để làm điều này?

Tôi muốn phân phối một tệp jar nếu có thể.

+0

Câu trả lời "Tom Hawtin - tackline" tốt hơn nhiều, nó chỉ xuất hiện muộn một chút. Vui lòng xem xét thay đổi câu trả lời đã chọn của bạn. – erickson

Trả lời

31

Để tạo một ImageIcon từ một tập tin hình ảnh trong các lọ cùng mã của bạn được nạp:

new javax.swing.ImageIcon(getClass().getResource("myimage.jpeg")) 

Class.getResource trả về một URL của một tài nguyên (hoặc null!). ImageIcon có một hàm tạo tải từ URL.

Để tạo URL cho tài nguyên trong một cái lọ không có trên "classpath" của bạn, hãy xem tài liệu cho java.net.JarURLConnection.

21

Bạn có thể thử một cái gì đó như:

InputStream stream = this.getClass().getClassLoader().getResourceAsStream("/images/image.jpg"); 

Trong tập tin JAR của bạn, bạn có thể có một cấu trúc thư mục của:

MyJar.jar
- com (file lớp tại đây)
- hình ảnh
---- image.jpg

8

này đang làm việc cho tôi để tải và cài đặt hình ảnh nội dung cửa sổ background:

jar (hoặc xây dựng đường dẫn) chứa:

- com 
- img 
---- bg.png 

java chứa:

JFrame f = new JFrame("Testing load resource from jar"); 
try { 
    BufferedImage bg = ImageIO.read(getClass().getResource("/img/bg.png")); 
    f.setContentPane(new ImagePanel(bg)); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Tested và làm việc trong cả lệnh jar và unjarred (là thuật ngữ kỹ thuật).

BTW getClass().getClassLoader().getResourceAsStream("/img/bg.png") - mà trước tiên tôi đã thử - trả lại cho tôi một InputStream không có giá trị.

+0

getResourceAsStream trả về NPE có liên quan gì đến phiên bản java không? Tôi cũng có NPE với getResourceAsStream nhưng getResource hoạt động hoàn hảo. –

0

Tải hình ảnh từ tệp Jar trong thời gian chạy giống như tải hình ảnh khi được thực thi từ IDE, ví dụ: netbeans sự khác biệt là khi tải hình ảnh từ tệp JAR đường dẫn phải chính xác và trường hợp nhạy cảm (rất quan trọng) . này làm việc cho tôi

 
image1 = new javax.swing.ImageIcon(getClass().getResource("/Pictures/firstgame/habitat1.jpg")); 
     img = image1.getImage().getScaledInstance(lblhabitat1.getWidth(), lblhabitat1.getHeight(), Image.SCALE_SMOOTH); 
     lblhabitat1.setIcon(new ImageIcon(img)); 

nếu p trong "/Pictures/firstgame/habitat1.jpg" là trong trường hợp thấp hơn nó sẽ không làm việc. kiểm tra không gian, trường hợp và chính tả

+0

Một lý do khác có thể là phần mở rộng của hình ảnh. Tôi nhận thấy rằng getClass(). GetResource ("/ Pictures/firstgame/habitat1.jpg") sẽ hiển thị và tải tốt từ IDE ngay cả khi bạn lưu hình ảnh là "habitat1.JPG" nhưng sẽ không tải từ tệp jar. Bạn phải lưu phần mở rộng với chữ thường là "habitat1.jpg" –

1

Trong netbeans 8.1 những gì tôi đã làm là để bao gồm các thư mục của các biểu tượng và hình ảnh khác gọi Tài bên trong src thư mục trong hồ sơ dự án. Vì vậy, bất cứ khi nào tôi xây dựng Jar, hãy lưu trữ thư mục vào đó.Cây tập tin nên được như thế này:

  • src (Java tập tin trong packges nguồn đang ở đây)
  • ** GÓI BẠN tên trong DỰ ÁN **

    • file.java
  • Tài

    • image.jpg

Mã nên được như:

jToggleButton1.setIcon(new javax.swing.ImageIcon(this.getClass().getResource("/resources/image.jpg"))); 
Các vấn đề liên quan