Java 无法使用createIcon()方法获取图像的路径(url)

Java 无法使用createIcon()方法获取图像的路径(url),java,imageicon,Java,Imageicon,因此,当我尝试使用我在按钮类中声明的createIcon()方法将图标放置到按钮时,效果很好 但是, 当我尝试将该方法放入另一个类(比如Utils.java)中,以便不需要在对象需要图标的类中重新声明该方法时,我会收到以下消息 无法加载图像:/images/Save16.gif 线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常:无法调用“java.net.URL.toExternalForm()”,因为“location”为null

因此,当我尝试使用我在按钮类中声明的
createIcon()
方法将图标放置到按钮时,效果很好

但是,

当我尝试将该方法放入另一个类(比如
Utils.java
)中,以便不需要在对象需要图标的类中重新声明该方法时,我会收到以下消息

无法加载图像:/images/Save16.gif
线程“AWT-EventQueue-0”java.lang.NullPointerException中出现异常:无法调用“java.net.URL.toExternalForm()”,因为“location”为null

*如果需要,会有更多信息

这是包含createIcon()方法的按钮类

public class Toolbar extends JToolBar implements ActionListener{
   private final JButton saveBtn;
   
   public Toolbar() {
      saveBtn = new JButton();

      saveBtn.setIcon(createIcon("/images/Save16.gif"));

      saveBtn.setToolTipText("Save");
      saveBtn.addActionListener(this);
      add(saveBtn);
   }

   private ImageIcon createIcon(String path) { 
      URL url = getClass().getResource(path);
    
      if(url == null) {
         System.err.println("Unable to load image: " + path);
      }
    
      ImageIcon icon = new ImageIcon(url);
    
      return icon;
  }
}
这是我试图在另一个类中声明的createIcon()方法

public class Utils {
    public static ImageIcon createIcon(String path) {
        URL url = System.class.getResource(path);

        if(url == null) {
                System.err.println("Unable to load image: " + path);
        }

        ImageIcon icon = new ImageIcon(url);

        return icon;
    }
}
setIcon()
方法更改为:

saveBtn.setIcon(Utils.createIcon("/images/Save16.gif"));
根据我在消息中的分析,问题可能是
url
无法从我的按钮类中获取
路径
,我尝试了几种替代方法,但仍然不起作用。我应该如何正确地设置它?谢谢

这很有效:

URL url = getClass().getResource(path);
因为您得到了工具栏类的类,它是所有其他类/文件所在的位置

这不起作用:

URL url = System.class.getResource(path);
因为“系统”类是在JDK中找到的,而不是应用程序类

我想你可以试试:

URL url = Utils.class.getResource(path);

你把
/images/
放在参考资料文件夹里了吗?或者它直接位于声明方法的类旁边(在将其移动到Utils之前?),如果您将
/images
指定为资源目录,则所使用的路径似乎可以。很抱歉,我没有真正理解您的要求。但是,我将图像包与源代码放在同一个文件夹中。但是非常感谢,罗布。