0

我用 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

我错过了什么?

4

2 回答 2

0

好的,看起来我通过将包含图片的“多媒体”文件夹拖放到 Eclipse 中的“highernumber”包中来获得可运行 JAR 中的图像文件。不过,我仍然收到 NullPointerException 。

于 2013-05-21T23:25:56.477 回答
0

我使用类似的东西:

URL myurl = this.getClass().getResource("file.png");
myIconImage = Toolkit.getDefaultToolkit().getImage(myurl);

你正在做的:

return new ImageIcon(cardIconURL);

也许试试我的第二行。我也将图像存储在罐子中。

于 2013-05-19T17:33:56.887 回答