我把这个代码直接从’Java all in one for Dummies’中取出来……为什么它不起作用?

import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; @SuppressWarnings("serial") public class Picture extends JFrame{ public static void main(String[] args){ new Picture(); } public Picture(){ this.setTitle("Picture"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); ImageIcon pic = new ImageIcon("TestImage.jpg"); p.add(new JLabel(pic)); this.add(p); this.pack(); this.setVisible(true); System.out.println(pic); } } 

这段代码只是显示一个折叠的框架。 我希望包(); 方法调用会调整我的.jpg图像周围的框架,对吗?

我已经可以听到第一个问题,是的,图像与我的项目包文件夹位于同一文件夹中。

我正在使用Eclipse IDE。

我还添加了println(); 声明查看Image引用返回的内容并返回“TestImage.jpg”。 我以为它会在内存中返回图像的地址。

我整个上午都在阅读论坛,如果不复制和使用其他人更复杂的代码,我无法找到任何可以帮助我的东西。 我尽量保持这个尽可能简单,这样我就不会混淆自己。

在此先感谢您的帮助。

该图像与我的项目包文件夹位于同一文件夹中

而已。

如上所述,您的程序在当前工作目录中查找映像,而不是包层次结构。

从获取String的构造函数的Javadoc ,它根据需要从指定的文件名中读取图像。 但是,当您指定相对路径时,这意味着相对于运行应用程序的工作目录进行读取。

要解决此问题,您有两种选择:

  • 指定相对于IDE运行程序的工作目录的图像文件名。我相信Eclipse在项目根目录中运行应用程序,源包层次结构以src为根。 在这种情况下,如果指定src/TestImage.jpg 。 缺点是,如果您从其他目录运行程序,则必须同时移动图像文件。 这对于分发/打包很不方便,因为您不能只删除JAR文件并使其运行。

  • 使用Java的资源加载器从包层次结构加载映像文件。 要做到这一点,首先使用

     getClass().getResource("TestImage.jpg") 

    获取图像的URL(相对于包根)。 看看ImageIcon有一个构造函数,它接受一个URL来读取图像。 所以你应该阅读图像

     new ImageIcon(getClass().getResource("TestImage.jpg")) 

    与程序包层次结构相关的优点是程序可以从任何位置运行,并且映像可以与您的应用程序捆绑在一个JAR文件中。

    旁白:最佳做法是创建一个包,在其中放置代码和资源(而不是仅将它们放在包根目录中)。 在这种情况下,请传递"com/example/someapp/TestImage.jpg"

尝试:

 ImageIcon image = new ImageIcon(getClass().getResource("TestImage.jpg")); 

有关详细信息,请参阅如何使用图标教程,特别是使用getResource部分加载图像 。