问题描述
而已。
按照编写的程序,程序将在 当前工作目录 (而不是程序包层次结构)中查找映像。
根据需要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”。我以为它会返回内存中图像的地址。
我整个上午都在阅读该论坛,如果没有复制和使用其他人的更复杂的代码,我真的找不到任何对我有帮助的地方。我试图使这一过程尽可能简单,以免混淆自己。
在此先感谢您的帮助。