2016-03-21 2 views
1

У меня проблема с Image Icons. Я знаю, что это было задано раньше, но я не могу понять, как это исправить, потому что я думаю, что моя проблема другая. Когда я запускаю приложение с eclipse, все работает. Но когда я делаю это runnable jar, он не будет показывать изображения.Jar не отображается Изображения

Некоторые код моего ImagesHolder Класс:

package Clicker; 

import javax.swing.ImageIcon; 

public class ImagesHolder { 

     final public ImageIcon AccessoriesIcon = new ImageIcon("Images/Part_Accessories.png"); 
     final public ImageIcon BodyIcon = new ImageIcon("Images/Part_Body.png"); 
     final public ImageIcon BrakesIcon = new ImageIcon("Images/Part_Brakes.png"); 
     final public ImageIcon CoolingIcon = new ImageIcon("Images/Part_Cooling.png"); 
     final public ImageIcon ElectronicsIcon = new ImageIcon("Images/Part_Electronics.png"); 
     final public ImageIcon EngineIcon = new ImageIcon("Images/Part_Engine.png"); 
     final public ImageIcon ExaustIcon = new ImageIcon("Images/Part_Exaust.png"); 
     final public ImageIcon FuelIcon = new ImageIcon("Images/Part_Fuel.png"); 
     final public ImageIcon InteriorIcon = new ImageIcon("Images/Part_Interior.png"); 
     final public ImageIcon SteeringIcon = new ImageIcon("Images/Part_Steering.png"); 
     final public ImageIcon SuspensionIcon = new ImageIcon("Images/Part_Suspension.png"); 
     final public ImageIcon TransmissionIcon = new ImageIcon("Images/Part_Transmission.png"); 
     final public ImageIcon TiresIcon = new ImageIcon("Images/Part_Tires.png"); 

И если я делаю изображения как URL, я не могу сбросить значки изображения, как здесь (я имею ярлыки и я хочу, чтобы изменить значок ярлыка)

Этикетки пример:

public JLabel AccessoriesLVL1Label = new JLabel(ImagesHolder.LockedIcon); 
    AccessoriesLVL1Label.setHorizontalTextPosition(JLabel.CENTER); 
     AccessoriesLVL1Label.setVerticalTextPosition(JLabel.BOTTOM); 
     AccessoriesLVL1Label.setText("<html>Accessories LVL 1<br>" + "Count: " + Part.parts[1]); 

И изменение:

if(CarMain.main[5] >=1){ 
      jbtnSellAccessoriesLv1.setEnabled(true);  
      Labels.AccessoriesLVL1Label.setIcon(ImagesHolder.AccessoriesIcon);   
     } 

Отредактировано: Если я это:

final public ImageIcon MoneyIcon = new ImageIcon("Images/Money.png"); 

Сделать как:

URL MoneyIcon = ImagesHolder.class.getResource("/Money.png"); 

Я получаю ошибку в этой строке:

Labels.MoneyLabel.setIcon(ImagesHolder.MoneyIcon); 

Ошибка:

The method setIcon(Icon) in the type JLabel is not applicable for the arguments (URL) 
+0

Прежде всего, вы проверили, что они находятся внутри банки? На всякий случай ... –

+0

@ user3272243 Да, я открыл файл jar как zip, и все изображения были. Но они были в основном, а не в папке с изображениями. Я попытался изменить местоположение изображения (в коде, чтобы работать, если изображения находятся в главной папке), но все равно не отображается изображение. – MsCrelix

+0

Если вы перемещаете их внутри банки, как если бы это был почтовый индекс в «правильное местоположение», они работают? Попытайтесь также использовать абсолютный маршрут, разместите их в этом месте, посмотрите, работает ли этот кувшин, чтобы отбросить его, если его трубка не работает или если проблема на вашей стороне. –

ответ

2

Ну, подведем итог ранее предоставленным ответам: Я предполагаю, что потенциальным решением было бы использовать classloader, как предложил Dark Knight. Кроме того, перед настройкой вам просто нужно создать новый ImageIcon.

URL MoneyIcon = ImagesHolder.class.getResource("/Money.png"); 
Labels.MoneyLabel.setIcon(new ImagesIcon(ImagesHolder.MoneyIcon)); 

Потому что, если вы снова просмотрите свой код, я думаю, что это несколько имеет смысл, он не работает. Я хочу сказать, что вы хотите установить ImageIcon, но последнее, что у вас есть, это объект URL. То, что это должно сделать ошибку, должно иметь смысл. Тем не менее, как уже сказал Эндрю Томпсон: вы можете построить ImageIcon с этого URL как показано/объяснено выше.

И так как вы также объяснили, что у вас возникли проблемы с каталогами (получение структуры из источника для компиляции), я хочу добавить некоторые ссылки для дальнейшего чтения: если вы просто используете «обычную» Java (без инструментов сборки), возможно, это ссылка может помочь: Copying data files upon build in Java/Eclipse. В основном это написано для Eclipse, но я думаю, что большинство других IDE должны предоставлять аналогичные варианты.

Из моих текущих проектов я также мог бы рекомендовать использовать такой инструмент, как Maven. Для небольших проектов это может быть немного сверху, но требуется большая работа (например, обработка библиотеки, обработка таких ресурсов, как изображения и т. Д.). Это всего лишь некоторые части, которые могут быть полезны для вас. Если это вас интересует, я думаю, вы найдете много полезных ресурсов в Интернете, поскольку Maven (или другие инструменты, такие как Ant и Gradle) довольно часто используются.

3

Существует альтернатива для получения изображений из файла jar:

Идеальный способ - иметь каталог ресурсов под вашим корнем проекта и включить его в список каталогов исходного кода. Это приведет к копированию всех изображений в JAR. Если вы создадите вспомогательную директорию, ресурсы/изображение, то вы получите JAR, у которого есть каталог изображений. Вы получаете доступ к этим изображениям через загрузчик классов:

classloader.getResourceAsStream("/image/image1.jpg"); 

или

classloader.getResource("/image/image2.jpg"); 

См this ссылку в деталях, например.

+0

Пожалуйста, ознакомьтесь с моим Редактированием. – MsCrelix

+0

* «Существует альтернатива для получения изображений из файла jar: ..' getResource' »* Это звучит так, как будто есть другой способ, чем доступ к ресурсу по URL-адресу. На самом деле я могу думать об одной «альтернативе», но это слишком ужасно для деталей. Нет. 'GetResource' (или' getResourceAsStream') - это просто ** путь ** для получения ресурсов из файлов Jar. Все остальное является «альтернативой». –

+0

@MsCrelix Не забудьте убедиться, что у вас есть изображения в каталоге ресурсов. –

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