【发布时间】:2013-05-19 17:20:42
【问题描述】:
我用 Java 创建了这个纸牌游戏。它的作用是它呈现一张正面朝上的牌和另外四张正面朝下的牌。您从 1 到 100 个硬币下注,并尝试从面朝下的牌中选择更高的牌。如果您选择更高的牌,您的赌注将翻倍,您可以选择在另一轮加倍或不加倍。
程序在一个包中使用了3个.java文件:
- HigherNumber:主类,包含大部分代码。
- Deck:包含表示一副纸牌的类的定义。
- 卡片:包含代表单个卡片的类的定义。
所以很自然,这个程序使用了很多图片来表示卡片。在我最初的实现中,我只是向 ImageIcon 传递了一个字符串来表示卡片的位置。就像,对于面朝下卡片的图标,
faceDown = new ImageIcon("multimedia/redBack.gif");
当我这样做时,程序在通过 Eclipse 运行时运行良好。所以我使用 Eclipse 导出到一个可运行的 JAR 文件。这个 JAR 文件然后运行没有问题,除非我将 JAR 文件移到其他任何地方,没有图像显示。
所以我研究并发现了如何使用 URL 来解决这个问题。我重新设计了程序以使用 URL,所以现在我有这样的东西:
//Set URL for default faceDown icon.
faceDownURL = this.getClass().getResource(pictureRoot +"redBack.gif");
//Set location for default back face of cards.
faceDown = new ImageIcon(faceDownURL);
现在它在 Eclipse 中运行良好,但我无法让导出的可运行 JAR 工作。从 Windows 运行时,它只是有点闪烁,什么也不做。当我通过命令行运行时,我得到了这个:
C:\Documents and Settings\mstabosz>java -jar C:\Temp\HigherNumber.jar
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(Unknown Source)
at higherNumber.Card.setImage(Card.java:150)
at higherNumber.Card.<init>(Card.java:36)
at higherNumber.Deck.<init>(Deck.java:22)
at higherNumber.HigherNumber.<init>(HigherNumber.java:16)
at higherNumber.HigherNumber.main(HigherNumber.java:857)
尝试按照这段代码,看起来问题的根源在第 150 行的 Card 类中。在第 150 行,该类在 setImage() 函数中,该函数正在构建一个名为 iconName 的字符串,用于在创建每张卡片时为其设置图像。然后它返回一个 ImageIcon 给 Card 类的构造函数。
//Set up the icon for the card.
this.cardIcon = setImage();
第 150 行是返回语句。以下是创建用于 ImageIcon 的 URL cardIconURL 的语句。
//Create a URL based on the constructed string.
URL cardIconURL = this.getClass().getResource(iconName);
return new ImageIcon(cardIconURL);
我只是不明白这里出了什么问题。当我使用字符串而不是 URL 时,该程序作为可运行的 JAR 运行良好。通过 Eclipse 运行时它工作正常。它现在不能作为可运行的 JAR。
我确实读过一些叫做清单的东西,但我很难理解。我确实让 Eclipse 为这个程序生成了一个清单:
Manifest-Version: 1.0
Main-Class: higherNumber.HigherNumber
我错过了什么?
【问题讨论】:
-
好吧,我强烈怀疑您的 jar 文件不包含图标...
-
尝试用7zip或winzip打开jar并查看文件列表
-
欧宾,谢谢。我安装了 7Zip 并查看了我的 JAR 文件,你是对的,它们不存在。里面唯一的东西是清单,一个包含所有类的文件夹,一个 .classpath 和一个 .project 文件。但是为什么里面没有呢?我只是告诉 Eclipse 制作一个可运行的 JAR 文件;它没有给我任何选择放在那里的东西。
-
好的,我刚刚创建了一个新的可运行 JAR,其中唯一的东西就是类。没有清单,没有包含图像的文件夹。类、清单和包含图像的文件夹位于 bin\higherNumber 文件夹中,但通过 Eclipse 导出只是将类导出到可运行的 JAR 中。如何将其他内容存储在 JAR 中?
标签: java eclipse manifest packaging