Изменение: было полезно загружать изображения только один раз в конструктор по умолчанию, теперь все работает намного быстрее. Проблема, однако, изменилась. Я больше не могу открыть файл jar, и если я запустил его с консоли с помощью java -jar BounceTheSphinx.jar, я получаю это
Exception in thread ''main'' java.lang.IllegalArgumentException: input == null!:
at javax.imageio.ImageIO.read<Unknown Source>
at BounceBack.PanneauJeu.<init>(PanneauJeu.java:55)
at BounceBack.FenetreJeu.<init>(FenetreJeu.java:21)
at BounceBack.MainBounceBack.main(MainBounceBack.java:11)
Строка 55 из PanneauJeu.java - fondArray[j] = ImageIO.read(this.getClass().getResource(imageArray[j]));
Я смотрел другие сообщения, но я не могу решить свою проблему с предлагаемыми решениями. Дело в том, что я действительно использую ту же технику для загрузки и отображения этих изображений, эти изображения существуют, все работает в eclipse, но fondArray
всегда вызывает проблему, а не fondPerdu
Я отредактировал код для вас, чтобы увидеть
Поэтому я написал в комментариях "РАБОТЫ" и "НЕ РАБОТАЕТ", чтобы вы могли видеть, где моя проблема.
public class PanneauJeu extends JPanel
{
private int i = 0;//color counter
private int j = 0;//imageArray counter
private int k = 0;//imagePerdu counter
private String[] imageArray = {"/resources/Sphinx.png", "/resources/Sphinx2.png ", "/resources/Sphinx3.png", "/resources/Sphinx4.png", "/resources/Sphinx5.png", "/resources/Sphinx6.png", "/resources/Sphinx7.png", "/resources/Sphinx8.png"};//score
private String[] imagePerdu = {"/resources/Lose5.png", "/resources/Lose6.png", "/resources/Lose7.png", "/resources/Lose8.png", "/resources/Lose9.png", "/resources/Lose10.png", "/resources/Lose11.png", "/resources/Lose12.png", "/resources/Lose13.png"};//, "Lose10.png", "Loose11.png", "Loose12.png"};
private Image fond;
private Image fondArray[] = new Image[imageArray.length];
private Image fondPerdu[] = new Image[imagePerdu.length];
public PanneauJeu()//default constructor
{
for(int j = 0; j < imageArray.length; j++)
{
//DOESN'T WORK
try
{
fondArray[j] = ImageIO.read(this.getClass().getResource(imageArray[j]));
}catch(IOException e){e.printStackTrace();}
}
for(int k = 0; k < imagePerdu.length; k++)
{
//WORKS
try
{
fondPerdu[k] = ImageIO.read(this.getClass().getResource(imagePerdu[k]));
}catch(IOException e){e.printStackTrace();}
}
}
Может ли кто-нибудь сказать мне, что может быть неправильно? Помните, все отлично работает в Eclipse.
Спасибо всем за вашу помощь
Не совсем понятно, в чем проблема, но есть один вероятный кандидат:
Вы загружаете изображение каждый раз, когда хотите его отобразить.
В случае анимации это означает, что вы пытаетесь постоянно перезагружать множество изображений. Это бремя как в отношении ввода-вывода, так и времени процессора. То, что вы хотите сделать, это загрузить изображения один раз, а затем сохранить их (вместо имен файлов), чтобы отображать их, когда они вам понадобятся. Таким образом, ваша программа не должна постоянно загружать и перезагружать одни и те же данные из файловой системы.
Там есть разумный шанс, что у вас есть другая проблема, но сделать это должно было бы легче найти.
После того, как вы перенесли загрузку один раз, если проблема не исчезнет, попробуйте запустить JAR из командной строки: запустите java -jar <PATH TO JARFILE>
и java -jar <PATH TO JARFILE>
, не распечатывает ли он какие-либо ошибки. Там есть хорошая вероятность, что произошла ошибка, которую вы не видите, если попытаетесь запустить JAR из графического интерфейса.