您必须编写一些代码来缓存这些;每次创建卡片对象时读取整个 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 构建期间移动。