1

好的,所以我创建了一个缓冲图像以显示在 JLabel 上。当我显示文件位置时,它需要一个 src/ 在我要访问的文件夹前面,否则会出现错误,我将看不到缓冲图像...我知道如果我把 'src/'在 resImg 前面,BufferedImage 不会显示在 IDE 之外。任何人都可以帮忙吗?这是在 IDE 内部工作的代码。从 .jar 文件外部运行时,图像不显示。

static File f = new File("src/resImg/banner.png");

try {
        banner = ImageIO.read(f);
        picLabel = new JLabel(new ImageIcon(banner));
        LabelPanel.add(picLabel);
    } catch (IOException ex) {
        Logger.getLogger(GameStart.class.getName()).log(Level.SEVERE, null, ex);
    }
4

5 回答 5

2

当资源在 jar 文件中时,它不是本地文件系统上的文件。你应该使用

URL imageSource = getClass().getResource("/resImg/banner.png");
if (imageSource == null) {
    // Handle the resource being missing
}
picLabel = new JLabel(new ImageIcon(imageSource));

在这里,您从类加载器中获取资源,这显然可以访问您的 jar 文件中的文件。

于 2012-10-02T13:57:37.847 回答
1

您不能File为 JAR 文件中的资源创建对象。改用这个。

URL imgurl = this.getClass().getClassLoader().getResource("resImg/banner.png");
picLabel - new JLabel(new ImageIcon(imgurl));

希望这可以帮助。

于 2012-10-02T13:59:59.387 回答
1

你必须找到一个父目录,相对路径可以从like开始

  • 工作区目录
  • 进程开始的目录

相对路径是从 java 进程开始的“realtiv”,因此路径可能会不时改变。

如果图片放在罐子里,可以使用

getClass().getResource("relativ jar path")

用于查找图像。罐子本身知道它放在哪里。

于 2012-10-02T14:00:31.183 回答
1

如果要从 jar 中获取图像,请像这样使用 smth:

URL imageurl = getClass().getResource("/images/imagename");
于 2012-10-02T13:59:08.823 回答
0

最可能的原因是您的图像未打包在 jar 文件中(使用 jar / zip 工具验证这一点)。

如果图像存在但不显示,那是因为您试图从相对于工作目录的文件系统中读取它(当然它不存在)

因此,正确的解决方案是从类路径中读取图像:

Thread.currentThread().getContextClassloader().getResourceAsStream(... path to your image relative to jar root ---)
于 2012-10-02T13:59:44.033 回答