从eclipse运行Java应用程序时,我的ImageIcon显示得很好.
但是在创建了一个jar之后,图像的路径显然被搞砸了.
有没有办法在运行时从jar中提取图像,以便我可以打开它?或者,有更好的方法吗?
如果可能的话,我想分发一个jar文件.
我在NetBeans 7.0中有一个Java项目.
我想动态地将一些图像添加到某个标签.图像将根据程序的状态而有所不同.
我把一个这样的图像'filling.jpg'放在我项目的'resources'文件夹中.
我想正确地访问此文件(不是通过绝对路径或相对路径,因为这会在构建jar文件时导致问题).
所以我找到了这个方法:
ImageIcon fillingIcon = new ImageIcon(getClass().getClassLoader().getResource("filling.jpg"));
labelFontFilling.setIcon(fillingIcon);
Run Code Online (Sandbox Code Playgroud)
它一直给我java.lang.NullPointerException.但我确信有那个图像,因为我可以从NetBeans Properties菜单中为该标签分配图像(但我不想这样,我想通过Java代码添加图像).
我做错了什么,我怎样才能正确地获得该图像?
我想将图标设置为我的JFrame.我做以下事情:
Image icon = Toolkit.getDefaultToolkit().getImage("src/images/icon.jpg");
this.setIconImage(icon);
Run Code Online (Sandbox Code Playgroud)
当我从netbeans运行此代码时它工作正常,但是当我尝试从jar文件运行此代码时,图像不会显示在我的JFrame中.我试图将图像作为资源加载:
this.setIconImage(Toolkit.getDefaultToolkit().getImage(getClass().getResource("/src/images/icon.jpg")));
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,它失败了 NullPointerException
Uncaught error fetching image:
java.lang.NullPointerException
at sun.awt.image.URLImageSource.getConnection(URLImageSource.java:99)
at sun.awt.image.URLImageSource.getDecoder(URLImageSource.java:113)
at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:240)
at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)
Run Code Online (Sandbox Code Playgroud)
我该怎么做这个工作?
编辑: 感谢所有,通过将图像指定为,解决了问题
Toolkit.getDefaultToolkit().getImage(getClass().getClassLoader().getResource("images/icon.JPG"))
Run Code Online (Sandbox Code Playgroud)
至于它看起来很奇怪,如果是这样的话会更好
this.setIconImage(new ImageIcon(pathToIcon).getImage());
Run Code Online (Sandbox Code Playgroud) 在过去的几个月里,我一直在为一个大学项目开发java游戏.它即将到达项目的最后阶段,我想将项目编译成一个易于分发的文件.游戏当前从IDE内部运行,并依赖于特定位置设置的工作目录(即具有声音/纹理的内容目录等).将所有这些放在一起以便携带的最佳方法是什么?我希望有一些方法可以将内容编译到jar文件中......
NB.我正在使用NetBeans,因此任何易于使用netbeans的解决方案都会获得额外的功劳;)
附录::
为了将来的参考,我找到了一种按目录访问东西的方法,这可能不是最好的方法,但它有效:
File directory = new File(ClassLoader.getSystemResource("fullprototypeone/Content/Levels/").toURI());
Run Code Online (Sandbox Code Playgroud)
现在我可以正常使用该文件对象