4
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);
    }

}

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

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

我正在使用 Eclipse IDE。

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

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

提前感谢您的帮助。

4

2 回答 2

6

尝试:

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

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

于 2012-08-04T22:31:04.180 回答
5

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

就是这样。

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

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

要解决此问题,您有 2 个选项:

  • 指定相对于 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"改为通过。

于 2012-08-04T22:30:29.513 回答