java - 图像适用于 jar 并适用于 jar,但在使用 String[] 数组存储图像名称时不适用
java - Image fits and works with jar, but not when using a String[] array to store the image names
编辑:
在默认构造函数中只加载一次图像很有帮助,现在一切都运行得更快。然而,问题已经改变。我无法再打开 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)
来自 PanneauJeu.java 的第 55 行是 fondArray[j] = ImageIO.read(this.getClass().getResource(imageArray[j]));
我查看了其他帖子,但我无法用所提出的解决方案解决我的问题。问题是,我真的使用相同的技术来加载和显示这些图像,这些图像存在,一切都在 eclipse 中工作,但 fondArray
总是导致问题,而不是 fondPerdu
我编辑了代码给大家看看
所以我在评论中写了“'WORKS'”和“不起作用”,以便您了解我的问题所在。
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 中一切正常。
谢谢大家的帮助
目前还不完全清楚问题是什么,但有一个可能的候选者:
您每次要显示图像时都在加载图像。
在动画的情况下,这意味着尝试不断地重新加载大量图像。这在 I/O 和 CPU 时间方面都是一种负担。您想要做的是一次加载您的图像,然后保留它们(而不仅仅是文件名)以便在您需要它们时显示。这样,您的程序就不必不断地从文件系统加载和重新加载相同的数据。
很有可能您还有其他问题,但这样做应该更容易找到它。
将加载移动到一次后,如果问题仍然存在,请尝试从命令行启动 JAR:运行 java -jar <PATH TO JARFILE>
,看看它是否打印出任何错误。如果您尝试从 GUI 启动 JAR,那么很可能会发生错误,您无法看到。
编辑: 在默认构造函数中只加载一次图像很有帮助,现在一切都运行得更快。然而,问题已经改变。我无法再打开 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)
来自 PanneauJeu.java 的第 55 行是 fondArray[j] = ImageIO.read(this.getClass().getResource(imageArray[j]));
我查看了其他帖子,但我无法用所提出的解决方案解决我的问题。问题是,我真的使用相同的技术来加载和显示这些图像,这些图像存在,一切都在 eclipse 中工作,但 fondArray
总是导致问题,而不是 fondPerdu
我编辑了代码给大家看看
所以我在评论中写了“'WORKS'”和“不起作用”,以便您了解我的问题所在。
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 中一切正常。
谢谢大家的帮助
目前还不完全清楚问题是什么,但有一个可能的候选者:
您每次要显示图像时都在加载图像。
在动画的情况下,这意味着尝试不断地重新加载大量图像。这在 I/O 和 CPU 时间方面都是一种负担。您想要做的是一次加载您的图像,然后保留它们(而不仅仅是文件名)以便在您需要它们时显示。这样,您的程序就不必不断地从文件系统加载和重新加载相同的数据。
很有可能您还有其他问题,但这样做应该更容易找到它。
将加载移动到一次后,如果问题仍然存在,请尝试从命令行启动 JAR:运行 java -jar <PATH TO JARFILE>
,看看它是否打印出任何错误。如果您尝试从 GUI 启动 JAR,那么很可能会发生错误,您无法看到。