2010-03-06 40 views
10

Tôi có một dự án Java với một thanh công cụ và thanh công cụ có các biểu tượng trên đó. Các biểu tượng này được lưu trữ trong một thư mục được gọi là tài nguyên /, ví dụ, đường dẫn có thể là "resources/icon1.png". Thư mục này nằm trong thư mục src của tôi, vì vậy khi được biên soạn, thư mục được sao chép vào bin/Cách truy cập tài nguyên trong tệp JAR?

Tôi đang sử dụng mã sau để truy cập tài nguyên.

protected AbstractButton makeToolbarButton(String imageName, String actionCommand, String toolTipText, 
     String altText, boolean toggleButton) { 

    String imgLocation = imageName; 
    InputStream imageStream = getClass().getResourceAsStream(imgLocation); 

    AbstractButton button; 
    if (toggleButton) 
     button = new JToggleButton(); 
    else 
     button = new JButton(); 

    button.setActionCommand(actionCommand); 
    button.setToolTipText(toolTipText); 
    button.addActionListener(listenerClass); 

    if (imageStream != null) { // image found 
     try { 
      byte abyte0[] = new byte[imageStream.available()]; 
      imageStream.read(abyte0); 

      (button).setIcon(new ImageIcon(Toolkit.getDefaultToolkit().createImage(abyte0))); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       imageStream.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } else { // no image found 
     (button).setText(altText); 
     System.err.println("Resource not found: " + imgLocation); 
    } 

    return button; 
} 

(imageName sẽ là "resources/icon1.png" v.v ...). Điều này làm việc tốt khi chạy trong Eclipse. Tuy nhiên, khi tôi xuất một JAR runnable từ Eclipse, các biểu tượng không được tìm thấy.

Tôi đã mở tệp JAR và thư mục tài nguyên ở đó. Tôi đã thử mọi thứ, di chuyển thư mục, thay đổi tệp JAR, v.v. nhưng tôi không thể hiển thị các biểu tượng.

Có ai biết tôi đang làm gì sai không?

(Là một câu hỏi phụ, có bất kỳ trình giám sát tệp nào có thể hoạt động với các tệp JAR không? Khi vấn đề đường dẫn phát sinh, tôi thường mở FileMon để xem điều gì đang xảy ra, nhưng nó chỉ hiển thị khi truy cập tệp JAR trong trường hợp này)

Cảm ơn bạn.

+1

Vì vậy, 5 dòng mã để tải biểu tượng tốt hơn, sau đó 2 dòng mã?Tất nhiên để tìm ra bí mật để sử dụng 2 dòng mã, bạn sẽ thực sự phải tự mình làm một số việc đọc. Tôi đoán bí mật sẽ vẫn ẩn. – camickr

Trả lời

5

Để tải một hình ảnh từ một sử dụng tài nguyên JAR đoạn mã sau:

Toolkit tk = Toolkit.getDefaultToolkit(); 
URL url = getClass().getResource("path/to/img.png"); 
Image img = tk.createImage(url); 
tk.prepareImage(img, -1, -1, null); 
+0

Bộ công cụ đó nằm trong gói nào? – tomasb

+0

@tomasb java.awt.Toolkit – Christian

10

tôi thấy hai vấn đề với mã của bạn:

getClass().getResourceAsStream(imgLocation); 

này giả định rằng các tập tin hình ảnh trong cùng một thư mục với file .class của lớp mã này là từ, không phải trong một thư mục nguồn lực riêng biệt. Hãy thử điều này thay vì:

getClass().getClassLoader().getResourceAsStream("resources/"+imgLocation); 

Một vấn đề khác:

byte abyte0[] = new byte[imageStream.available()]; 

Phương pháp InputStream.available() không không trở lại tổng số byte trong dòng! Nó trả về số byte có sẵn mà không bị chặn, thường ít hơn nhiều.

Bạn phải viết một vòng lặp để sao chép các byte sang tạm thời ByteArrayOutputStream cho đến khi kết thúc luồng. Hoặc, sử dụng getResource() và phương pháp createImage() có tham số URL.

4

Phần từ hướng dẫn Swing trên How to Use Icons cho bạn biết cách tạo URL và đọc Biểu tượng trong hai câu lệnh.

0

Ví dụ trong một dự án NetBeans, tạo một thư mục tài nguyên trong thư mục src. Đặt hình ảnh của bạn (jpg, ...) vào đó.

Cho dù bạn sử dụng ImageIO hoặc Toolkit (bao gồm getResource), bạn phải bao gồm một hàng đầu/trong con đường của bạn để các tập tin hình ảnh:

Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/resources/agfa_icon.jpg")); 
setIconImage(image); 

Nếu mã này là bên trong lớp JFrame của bạn, hình ảnh sẽ được thêm vào khung như một biểu tượng trong thanh tiêu đề của bạn.

Các vấn đề liên quan