我直接从“ Java for Dummies的所有功能”中直接提取了这段代码……为什么不起作用?

问题描述

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

而已。

按照编写的程序,程序将在 当前工作目录 (而不是程序包层次结构)中查找映像。

根据需要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"

解决方法

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”。我以为它会返回内存中图像的地址。

我整个上午都在阅读该论坛,如果没有复制和使用其他人的更复杂的代码,我真的找不到任何对我有帮助的地方。我试图使这一过程尽可能简单,以免混淆自己。

在此先感谢您的帮助。