【发布时间】:2019-12-16 16:52:24
【问题描述】:
我想在 Eclipse 中将图像打包到一个可执行的 .jar 文件中,但即使在存储它们并链接到它们之后,它们似乎也没有出现。我正在尝试关注this guide,因为它似乎最接近我想要做的事情。
据我了解,我需要将 4 个图像文件中的每一个都作为 BufferredImage 从 InputStream 中读取,然后需要将它们改回常规图像,以便它们在 JavaFX 中正常工作。我已经尝试了很多变体,但是这个似乎效果最好的变体给了我一个 java.lang.reflect.InvocationTargetException,所以它甚至不能在 Eclipse 中正常工作。我知道有类似的问题,但似乎没有一个专门回答我的问题(大多数处理 ImageIcons 和 JFrames),或者我无法正确地将它们拼凑在一起。
public class CardPane extends Pane
{
private static Image[] images;
private static BufferedImage img1;
private static BufferedImage img2;
private static BufferedImage img3;
private static BufferedImage img4;
private static Image image1;
private static Image image2;
private static Image image3;
private static Image image4;
static
{
try {
img1 = ImageIO.read(ResourceLoader.getImage("green-club-100.png"));
img2 = ImageIO.read(ResourceLoader.getImage("pink-heart-100.png"));
img3 = ImageIO.read(ResourceLoader.getImage("black-spade-100.png"));
img4 = ImageIO.read(ResourceLoader.getImage("blue-diamond-100.png"));
}
catch (IOException e) {
e.printStackTrace();
}
image1 = SwingFXUtils.toFXImage(img1,null);
image2 = SwingFXUtils.toFXImage(img2,null);
image3 = SwingFXUtils.toFXImage(img3,null);
image4 = SwingFXUtils.toFXImage(img4,null);
images[0] = image1;
images[1] = image2;
images[2] = image3;
images[3] = image4;
}
}
final public class ResourceLoader {
public static InputStream getImage(String path) {
InputStream input = ResourceLoader.class.getResourceAsStream(path);
if (input == null)
input = ResourceLoader.class.getResourceAsStream("/" + path);
return input;
}
}
Here is what it looks like on the file explorer.我将构建路径配置为将 res 文件夹标记为源文件夹,我相信这是我应该做的。
是否有快速解决方法来消除调用错误,或者我是否将整个事情完全错了?抱歉,如果这个问题令人困惑或看起来很愚蠢,我对编码和这个网站还很陌生。任何帮助将不胜感激,如果需要查看更多代码,我将很乐意分享!谢谢!
编辑:考虑到建议,我尝试了不同的方法,但似乎都不起作用。它们在 Eclipse 和我的计算机上运行良好,但在其他设备上打开 jar 时图像不会显示。 这是第一个资源加载器
private static Image[] images = new Image[4];
private static Image image1 = new Image(ResourceLoader.getImage("green-club-100.png"));
private static Image image2 = new Image(ResourceLoader.getImage("pink-heart-100.png"));
private static Image image3 = new Image(ResourceLoader.getImage("black-spade-100.png"));
private static Image image4 = new Image(ResourceLoader.getImage("blue-diamond-100.png"));
static
{
images[0] = image1;
images[1] = image2;
images[2] = image3;
images[3] = image4;
}
第二个没有,使用example 2中的URL
public static URL url1 = CardGridPaneTest.class.getResource("green-club-100.png");
public static URL url2 = CardGridPaneTest.class.getResource("pink-heart-100.png");
public static URL url3 = CardGridPaneTest.class.getResource("black-spade-100.png");
public static URL url4 = CardGridPaneTest.class.getResource("blue-diamond-100.png");
public static Image image1 = new Image(url1.toString());
public static Image image2 = new Image(url2.toString());
public static Image image3 = new Image(url3.toString());
public static Image image4 = new Image(url4.toString());
public static Image[] images = new Image[4];
static {
images[0] = image1;
images[1] = image2;
images[2] = image3;
images[3] = image4;
}
【问题讨论】:
-
“据我了解,我需要将 4 个图像文件中的每一个作为 BufferredImage 从 InputStream 中读取,但随后需要将它们改回常规图像,以便它们在 JavaFX 中正常工作。 " 不是。
Image提供a constructor takingInputStream之外还有一个you could pass the resource url (converted to string) to。 -
@fabian 我编辑了我的帖子,向您展示了我尝试实施您的建议的两种不同方式,但似乎都不起作用。当我在我的计算机上运行 jar 时它们出现,但当其他人试图从我的网站打开 jar 时却没有出现,这很奇怪吗?让我觉得东西仍在本地加载,或者完全有另一个错误。
-
尝试从类路径根目录开始的资源路径:
CardGridPaneTest.class.getResource("/green-club-100.png")。对于某些版本的 java,相对于类的路径对我停止工作...... -
不走运:/ 不过感谢您的帮助。我发誓我已经尝试了所有方法并遵循了 Youtube/stackoverflow 示例,我真的不知道可能出了什么问题......
-
您还可以尝试另一件事:将文件名和资源路径中的
-s 替换为_s。根据以下文档,至少对于 java 8,您需要使用一个也是有效标识符的文件名:docs.oracle.com/javase/8/docs/technotes/guides/lang/…
标签: java eclipse image javafx jar