0

我知道这个问题的留言板上有一千个答案,我已经尝试了所有答案,但无论出于何种原因,它们都没有奏效。这是我的代码的摘录:

 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。所以我然后做了 project/properties/sources/add 文件夹的事情,编译它,结果还是一样。然后我将classes文件夹移动到dist文件夹中,尝试更改路径,看看是否有效,仍然没有。听起来有一个简单的答案,但我显然错过了它。

4

1 回答 1

1

您在构造函数中使用绝对路径名。绝对路径名的示例是“/home/myusername/folder/foo/bar.png”或“C:\Folder\Graphics\foo\bar.png”。您在帖子中给出的代码总是希望在运行时从给定的路径中准确读取。如果您将图形移动到不同的文件夹,您的程序将无法找到它们。这样,图形不会包含/打包到您的程序中,而是在运行时(不是编译时!)从构造函数中指定的路径加载。

这种绝对路径是非常糟糕的做法,因为它们会阻止您的程序可移植。其他人将无法在他们的计算机上运行您的程序。因为如果您尝试在另一台机器上运行它,代码可能会失败,因为该计算机上可能不存在路径“/home/james/...”。也许您的用户甚至不使用 Linux,或者至少他的用户名不是“james”。

所以你必须摆脱绝对路径。相反,您应该注意将您的图形包含在您的项目中,并将它们放入 JAR 存档中。

一种方法是将您的图形放入项目的目录结构中,然后执行以下操作:

URL imageURL = getClass().getClassLoader().getResource("images/A_Flute.png");
ImageIcon fluteIcon = new ImageIcon(imageURL);

当然,如果您的图形保留在您的主文件夹中,这将不起作用。您必须复制图形。

于 2013-03-30T18:28:08.940 回答