setIconImage仅在eclipse中有效,在导出为runnable jar文件时不起作用

时间:2014-12-05 00:37:54

标签: java eclipse swing jframe icons

我已经搜索了一段时间来修复此问题。我的工作区中有一个项目文件夹(该文件夹基本上是我的根目录),其中有一个名为icon.gif的文件。在我的计划中,我有以下内容:

package com.mgflow58.Main;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class Game {

    public static void main(String[] args) {
        JFrame window = new JFrame("Guppy's Adventure");
        window.add(new GamePanel());
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        window.pack();
        window.setLocationRelativeTo(null);
        window.setVisible(true);
        window.setIconImage(new ImageIcon("icon.gif").getImage());
    }

}

当我运行它时,图标在eclipse中工作正常,但导出的jar文件不会像在eclipse中那样显示图标。知道为什么吗?我试图解决这个问题,我疯了。

1 个答案:

答案 0 :(得分:1)

jar文件包含其正确文件夹中所需的所有图像文件。

有问题...... ImageIcon(String)正在寻找名字 文件在磁盘上,如JavaDocs ...

所述
  

public ImageIcon(String filename)

从中创建一个ImageIcon   指定的文件。将使用MediaTracker预加载图像   监视图像的加载状态。指定的String可以是   文件名或文件路径。指定路径时,请使用   Internet标准正斜杠(" /")作为分隔符。 (字符串是   转换为URL,因此正斜杠适用于所有系统。)For   例如,指定:

     

new ImageIcon("images/myImage.gif")

     

描述初始化为文件名字符串。   

参数:
filename - 指定a的字符串   文件名或路径

资源不再驻留在磁盘上,但未嵌入到Jar文件中,因此无法再使用基于File的方法访问它们。

相反,您需要使用类似Class#getResource的内容,例如......

window.setIconImage(new ImageIcon(Game.class.getResource("icon.gif")).getImage());

话虽如此,我还建议使用ImageIO而不是ImageIcon,原因有多种,但主要是因为如果无法加载资源,它实际上会抛出异常某种原因,而不是默默地失败......

请查看Reading/Loading an Image了解详情