我一直在为辅助项目开发扑克游戏,以介绍自己如何使用IntelliJ和Java进行图像和GUI开发。我现在处于一个阶段,要从台式机上存储的卡图像集合中为单个卡分配图像。
是否有任何具体资源可用于将我的图像文件夹添加到项目本身内的某种其他文件夹中,以便我可以直接从项目而不是从桌面加载这些图像。另外,如何分配这些图片?
目前,我有一个卡片类,它从2个枚举类(SUIT)和另一个存储RANK(值)的Enum类构建自己。
卡片卡片=新卡片(EnumSuit西装,EnumRank等级,“需要在此部分应用图片”
很抱歉,我的解释不好,谢谢您的帮助!
编辑:我曾经尝试使用BufferedImage和ImageIO,但是每次都要从桌面加载时,我很难为之困惑。
答案 0 :(得分: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
所在的位置。
即使您将类和图像组合在一起创建一个jar文件,此机制(x.class.getResource
)仍然有效。请注意,eclipse会将非Java文件直接从src复制到bin,在maven中,放置在'resource'目录中的所有内容也会在maven构建过程中移动。