我知道在这个问题的留言板上有一千个答案,我已经尝试了所有这些答案,但没有一个人因为某种原因而工作。以下是我的代码的摘录:
ImageIcon icon = new ImageIcon("/home/james/programmingpics/A_Flute");
ImageIcon icon1 = new ImageIcon("/home/james/programmingpics/C_D_Flute");
ImageIcon icon2 = new ImageIcon("/home/james/programmingpics/D_E_Flute");
ImageIcon icon3 = new ImageIcon("/home/james/programmingpics/E_Flute");
ImageIcon icon4 = new ImageIcon("/home/james/programmingpics/F_G_Flute");
ImageIcon icon5 = new ImageIcon("/home/james/programmingpics/G_Flute");
ImageIcon icon6 = new ImageIcon("/home/james/programmingpics/B_Flute");
ImageIcon icon7 = new ImageIcon("/home/james/programmingpics/C_Flute");
ImageIcon icon8 = new ImageIcon("/home/james/programmingpics/D_Flute");
ImageIcon icon9 = new ImageIcon("/home/james/programmingpics/F_Flute");
非常简单,在我的电脑上运行时非常完美。每当我压缩dist文件夹时,将图片从我的计算机上的目录中移出并运行程序,我就会回到空的JFrame中。所以我然后做了项目/ properties / sources / add文件夹的事情,编译它仍然是相同的结果。然后我将classes文件夹移动到dist文件夹,尝试更改路径,看看是否有效,仍然没有。这听起来似乎有一个简单的答案,但我显然错过了它。
答案 0 :(得分:1)
在构造函数中使用绝对路径名。绝对路径名的示例是“/home/myusername/folder/foo/bar.png”或“C:\ Folder \ Graphics \ foo \ bar.png”。 您在发布时给出的代码总是希望在运行时从给定路径中精确读取。如果将图形移动到其他文件夹,则程序将无法找到它们。这样,图形不会包含/打包到程序中,但它们是在运行时(不是编译时!)从构造函数中指定的路径加载的。
这种绝对路径是非常糟糕的做法,因为它们会阻止您的程序移植。其他人将无法在他们的计算机上运行您的程序。因为如果您尝试在另一台计算机上运行该代码,代码可能会失败,因为该计算机上可能不存在路径“/ home / james / ...”。也许你的用户甚至不使用Linux,或者至少他的用户名不是“詹姆斯”。
所以你必须摆脱绝对路径。相反,您应该注意将图形包含在项目中,并将它们放入JAR存档中。
一种方法是将图形放入项目的目录结构中,然后执行以下操作:
URL imageURL = getClass().getClassLoader().getResource("images/A_Flute.png");
ImageIcon fluteIcon = new ImageIcon(imageURL);
如果你的图形保留在你的主文件夹中,这当然是行不通的。你必须复制图形。