0

我一直在为副项目开发一个扑克游戏,以介绍自己使用 IntelliJ 和 java 的图像和 GUI 开发。我现在正处于一个阶段,我想从我桌面上的卡片图像集合中将图像分配给单个卡片。

是否有任何具体资源可用于将我的图像文件夹添加到项目本身的某种其他文件夹中,以便我可以直接从项目而不是从桌面加载这些图像。另外,如何分配这些图像?

目前我有一个卡片类,它由 2 个存储 SUIT 的 Enum 类和另一个存储 RANK(值)的 Enum 类构建。

Card card = new Card(EnumSuit suit, EnumRank rank, "这部分需要申请图片)

抱歉,如果我的解释不好,并感谢您的帮助!

编辑:我尝试过使用 BufferedImage 和 ImageIO,但每次都必须从桌面加载,这让我很难理解。

4

1 回答 1

1

您必须编写一些代码来缓存这些;每次创建卡片对象时读取整个 PNG 或 JPG 会使事情变得非常缓慢。我将假设 EnumSuit 和 EnumRank (旁注:坏名;专有名称是 CardSuit 和 CardRank 甚至只是 Suit 和 Rank;您的编辑可以告诉您它们是枚举,您不必那样命名事物。您也没有将其命名为 ClassCard :P)

示例代码:

import java.awt.image.BufferedImage;
import javax.image.ImageIO;
import java.util.HashMap;
import java.util.Map;

public class Card {
  private static final Map<String, BufferedImage> imageCache = new HashMap<>();

  public static BufferedImage getImage(CardRank rank, CardSuit suit) {
     String k = rank.toString() + suit.toString();
     return imageCache.computeIfAbsent(k, k -> loadImage(k));
  }

  private static BufferedImage loadImage(String key) {
    try {
      return ImageIO.read(Card.class.getResource("cardImages/" + key + ".png"));
    } catch (IOException e) {
      System.err.println("Missing card image: " + key + ".png");
      System.err.println(e.getClass().getName() + ": " + e.getMessage());
      // Return a blank image instead.
      return new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB);
    }
  }
}

上面的代码缓存了你的图像(getImage 使用缓存,loadImage 总是从磁盘加载,这就是它被标记的原因private)。请注意,它使用的MyClassName.class.getResource机制是在与 VM 找到文件的位置相同的位置查找提供的文件MyClassName.class

所以,如果你有这个:

C:\MyProjects\card_exercise\src\Card.java

你的 IDE、maven、gradle、ant 或任何你用来编译它的东西最终都会使类文件出现在这里:

C:\MyProjects\card_exercise\bin\Card.class

那么上面的代码片段将在以下位置查找“4A.png”:

C:\MyProjects\card_exercise\bin\cardImages\4A.png

因为它看起来相对于所在的位置Card.class

x.class.getResource即使您创建了一个将类和图像组合在一起的 jar 文件,这种机制 ( ) 仍然有效。请注意,eclipse 会将非 java 文件直接从 src 复制到 bin,并且在 maven 中,放置在“resource”目录中的任何内容也会在 maven 构建期间移动。

于 2018-09-07T18:03:42.683 回答