我有这样的文件夹结构。
Project/src/folder/folder/folder/xyz.java
/img/background.jpg
我想将 background.jpg 放入 xyz.java
中的 JPanel 中。只是为了背景。
我已经做到了
private ImageIcon createImageIcon(String path, String description) {
java.net.URL imgURL = getClass().getResource(path);
if (imgURL != null) {
return new ImageIcon(imgURL, description);
} else {
System.err.println("Couldn't find file: " + path);
return null;
}
}
但这里的问题是图像必须与 xyz.java
位于同一文件夹中
我搜索了一下,发现这可以用 getResourceAsStream("path")
解决,但我无法提供足够的知识来解决这个问题。
这对我很重要,因为我想在不同的操作系统上将我的程序作为 *.jar 文件运行。
我的问题是我不明白 getRessourceAsStream("path") 的工作方式应该有何不同。我找不到适合我的教程。似乎大多数人将它用于不同的 .jar 文件或小程序。而且我不知道 Stream 可以做什么,getRessourceAsStream("path") 从哪里开始(意味着我必须如何编写路径)。知识太缺乏了……
编辑:我找到了一个不需要给出完整路径的解决方案。
img = ImageIO.read(getClass().getResource("../../../../img/bg_1.jpg"));
我没有测试它,但它应该也可以在其他系统上运行。但问题是,我只能在 Eclipse 中启动我的程序。当我将它导出到 *.jar 文件时,一切正常,但没有加载图片。即使我已经设置了 setPreferredSize,它也会将窗口缩小到最小。
所以我也许应该解决 Stream 解决方案。但现在该 sleep 了。
编辑:当我将图像放入包中时,相对路径工作正常。这不是我真正想要的,但在猜测这个小问题 6 小时后,我不得不带一些鱼在我的海洋中游动......
最佳答案
既然你还没有回复我的评论,我会提出一些问题并提出建议作为答案:
是否都包含在一个 Jar 文件中?您是否尝试过在命令行上传递图像路径或图像目录并将其作为命令行参数读入?再说一次,为什么在显示图像而不是 ImageIcon 时使用 ImageIcons?
编辑 1
关于您的意见:
I am using an ImageIcon because ##java on freenode.net told me it fits for my habits.
我不知道 ##java 是谁,也不知道你适合什么“习惯”,但目前的情况是你正在使用 Image 而 ImageIcon 与此无关,所以真的,摆脱它的。简化并只使用你需要的东西。
My First solution was something like that: img = ImageIO.read(new File("path")); But it needs also the full path and not some URL path which I know from html.
ImageIO.read 的路径要求与您尝试做的没有什么不同。这是对您的解决方案的一个很好的补充。
The Jar file sould run without any extras on different OS. I just need one of it.
您还没有告诉我们您的图像是否在 jar 中,以及图像与您的类文件相关的位置,因为这是使用资源的关键——加载相对于位置的资源类文件。
关于java - 背景与 getResourceAsStream ("path"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6542372/