我一直在开发一个侧面项目的扑克游戏,介绍自己使用IntelliJ和java一般使用图像和GUI开发。我现在处于一个阶段,我想从我桌面上的卡片图像集合中将图像分配给单个卡片。
是否有任何具体资源可用于将我的图像文件夹添加到项目本身的某个其他文件夹中,以便我可以直接从项目而不是从桌面加载这些文件。另外,如何分配这些图像?
目前我有一个卡片类,它从2个存储SUIT的Enum类和存储RANK(值)的另一个类构建。
卡片卡=新卡(EnumSuit套装,EnumRank等级,“需要在此部分应用图像)
如果我的解释很糟糕并且感谢您的帮助,请道歉!
编辑:我已经尝试过使用BufferedImage和ImageIO,但每次都要从桌面加载时很难解决。
你必须写一些代码来缓存这些;每次创建卡片对象时读取整个PNG或JPG都会让事情变得非常缓慢。我将假设EnumSuit和EnumRank(旁注:错误的名字;专有名称是CardSuit和CardRank,甚至只是套装和等级;你的编辑可以告诉你它们是枚举,你不必这样命名。你。没有把它命名为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构建过程中被移动。