我在哪里放一个图像来使用它来创建一个新的Swing ImageIcon对象?

时间:2013-09-25 14:39:22

标签: java swing embedded-resource imageicon

我正在学习Java Swing库,我遇到了一个问题。

在示例程序中,它通过以下行创建 ImageIcon 对象:

ImageIcon icon = new ImageIcon(getClass().getResource("exit.png"));

当我执行我的程序时,我得到以下错误:项目中 exit.png 缺失:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.ImageIcon.<init>(ImageIcon.java:205)
    at com.andrea.second.SimpleMenu.initUI(SimpleMenu.java:23)
    at com.andrea.second.SimpleMenu.<init>(SimpleMenu.java:17)
    at com.andrea.second.SimpleMenu$2.run(SimpleMenu.java:53)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

问题是,使用Eclipse,我必须放置这个immage?

我尝试将它(在我的文件系统中,而不是在Eclipse中)复制并粘贴到包含创建它的类的相同包文件夹中...但它不起作用

我有什么办法在Eclipse中解决这个问题?

1 个答案:

答案 0 :(得分:5)

ImageIcon icon = new ImageIcon(getClass().getResource("exit.png"));

您需要将exit.png放在与getClass()所代表的类相同的包中。

ImageIcon icon = new ImageIcon(getClass().getResource("/exit.png")); // note leading /

您需要将它放在类路径的根目录下。在Eclipse中,将其直接放在src

The Class#getResource(String) javadoc states

  

在委托之前,从中构造绝对资源名称   使用此算法给定资源名称:

     

如果名称以'/'('\ u002f')开头,则绝对名称为   资源是'/'后面的名称部分。

     

否则,绝对名称的格式如下:

     

modified_pa​​ckage_name / name其中modified_pa​​ckage_name是   这个对象的包名称用'/'代替'。' ( '\ u002e')。