После экспорта java не может найти / нарисовать изображения - PullRequest
2 голосов
/ 17 октября 2011

Hello stackoverflowites,

Я нахожусь в процессе разработки 2d-игры, и когда я запускаю ее в eclipse, моя программа прекрасно загружает все ее изображения и ресурсы. Однако я использую не обязательно рекомендуемый способ создания своих изображений и значков изображений, который показан ниже:

bannerLogo.setIcon(new ImageIcon("/res/client/BannerHeader.jpg"));

Теперь при экспорте в банку изображение не отображается (что ожидается, поскольку я не использую правильный путь).

Я искал правильный способ сделать это, который я нашел:

URL imgURL = getClass().getResource("/res/client/BannerHeader.jpg");
Image bannerImg = Toolkit.getDefaultToolkit().getImage(imgURL);
bannerLogo.setIcon(new ImageIcon(bannerImg));

И это тоже не сработало, я получаю трассировку "Uncaught error fetching image:", которая просто говорит мне, что мой URL (imgURL) является нулевым. (Это когда я бегу в затмении, заметьте, я еще даже не экспортировал его)

Я полагаю, это как-то связано с моим путем к классу, однако я не могу понять, что.

Внутри затмения моя структура пакета выглядит следующим образом:

(Родительский каталог, название проекта)

+ папка src, содержит нормальные пакеты и т. Д. По пути сборки

+ папка ресурса, ("res"), не по пути сборки (пробовал по пути сборки, ничего не изменилось)

+++ подкаталоги папки ресурсов

Я в растерянности, что здесь делать, ребята. Извините за стену текста.

Ответы [ 2 ]

7 голосов
/ 17 октября 2011

Ваш код изначально искал файлы изображений, и файлы не существуют внутри файла Jar, только ресурсы. Итак, вы были правы, пытаясь использовать getClass.getResource("/res/client/BannerHeader.jpg");. Но убедитесь, что изображение на самом деле находится в файле jar в каталоге вне каталога файла класса, и используйте путь относительно каталога пути к классам.

Ошибка не говорит вам, что это неправильно или что файл имеет значение null, но вам нужно поместить это в блок try / catch. Я предлагаю вам прочитать Учебник по исключениям , чтобы узнать больше об этом.

Редактировать 1
Когда вы заявили, что у вас есть ошибка с неперехваченным исключением, мне показалось, что у вас ошибка компиляции, а не исключение времени выполнения. Извините за путаницу.

Что касается того, где размещать изображения, это в некоторой степени зависит от того, какую IDE вы используете. Я использую Eclipse, и я добавляю каталог из моего каталога пакетов Java-файлов, который я называю images, и помещаю туда свои изображения. Затем я использую ресурсы для поиска «images / MyImage.jpg».

Например, скажем, мои пакеты в Eclipse выглядят так:

Eclipse Package Explorer Image

Таким образом, файлы классов находятся в пакете myPackage, а файл изображения GridBoxClassPic.JPG находится в каталоге images вне каталога файлов классов, поэтому я могу найти его с помощью String String RESOURCE_PATH = "images/GridBoxClassPic.JPG";.

Этот код может показать изображение:

import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class MyClass {
   private static final String RESOURCE_PATH = "images/GridBoxClassPic.JPG";

   public MyClass() {
      try {
         BufferedImage image = ImageIO.read(getClass().getResource(RESOURCE_PATH));
         ImageIcon icon = new ImageIcon(image);
         JLabel label = new JLabel(icon);
         JOptionPane.showMessageDialog(null, label);
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   public static void main(String[] args) {
      new MyClass();
   }
}
1 голос
/ 17 октября 2011

хорошо, если вы следовали первому способу, я думаю, вам нужно просто создать исполняемый файл jar в eclipse. Затем вам нужно поместить изображения, которые вы загружаете, в тот же каталог, что и файл jar, с тем же относительным путем, который вы указали в своей программе. Например

 your_directory
             ---> game_runnable.jar
             ---> res
                  ---> client 
                       -->BannerHeader.png

Я думаю, что это будет работать тогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...