2010-03-06 2 views
10

У меня есть проект Java с панелью инструментов, и на панели инструментов есть значки на нем. Эти значки хранятся в папке с именем resources /, поэтому, например, путь может быть «resources/icon1.png». Эта папка находится в моей директории src, поэтому, когда она скомпилирована, папка скопирована в bin/Как получить доступ к ресурсам в JAR-файле?

Я использую следующий код для доступа к ресурсам.

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 будет «resources/icon1.png» и т. Д.). Это отлично работает при запуске в Eclipse. Однако, когда я экспортирую исполняемый JAR из Eclipse, значки не найдены.

Я открыл файл JAR и папка с ресурсами. Я пробовал все, перемещая папку, изменяя файл JAR и т. Д., Но я не могу заставить значки отображаться.

Кто-нибудь знает, что я делаю неправильно?

(Как вопрос, есть ли какой-либо монитор файлов, который может работать с файлами JAR? Когда возникают проблемы с путями, я обычно просто открываю FileMon, чтобы посмотреть, что происходит, но он просто появляется как доступ к файлу JAR в этом случае)

спасибо.

+1

Так что 5 строк кода для загрузки значка лучше, а затем 2 строки кода?Конечно, чтобы узнать секрет использования двух строк кода, вам действительно нужно будет самостоятельно почитать. Я думаю, секрет останется скрытым. – camickr

ответ

5

Чтобы загрузить изображение с использованием JAR ресурсов следующий код:

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

Какой пакет этот Инструментарий внутри? – tomasb

+0

@tomasb java.awt.Toolkit – Christian

10

Я вижу две проблемы с кодом:

getClass().getResourceAsStream(imgLocation); 

Это предполагает, что файл изображения находится в той же папке, что и файл .class класса этот код составляет от, а не в отдельной папке ресурсов. Попробуйте вместо этого:

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

Еще одна проблема:

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

InputStream.available() метод делает не возвращение общее число байтов в потоке! Он возвращает количество доступных байтов без блокировки, что часто намного меньше.

Вы должны написать цикл, чтобы скопировать байты в временный ByteArrayOutputStream до тех пор, пока не будет достигнут конец потока. В качестве альтернативы используйте getResource() и метод createImage(), который принимает параметр URL.

4

В разделе из учебника Swing по адресу How to Use Icons показано, как создать URL-адрес и прочитать значок в двух операциях.

0

, например, в проекте NetBeans, создайте папку ресурсов в папке Src. Поместите свои изображения (jpg, ...) туда.

Используете ли вы ImageIO или Toolkit (включая getResource), вы должны включать в себя ведущий/в вашем пути к файлу изображения:

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

Если этот код находится внутри вашего класса JFrame, изображение добавляется кадр как значок в строке заголовка.

Смежные вопросы