我一直在为副业开发一个扑克游戏,以介绍我自己在IntelliJ和java中使用图像和图形用户界面的开发。我现在正处于这样一个阶段,我想从我桌面上的一组卡片图像中将一个图像分配给单个卡片。
有没有什么具体的资源可以将我的图片文件夹添加到项目本身的其他文件夹中,这样我就可以直接从项目中加载这些图片,而不是从桌面加载。另外,如何分配这些图像?
目前,我有一个卡片类,它由两个Enum类构建而成,其中两个类存储花色值,另一个类存储等级(值)。
卡片卡片=新卡片(EnumSuit套装,EnumRank等级,“需要在此部分应用图像)”
如果我的解释不好,我深表歉意,感谢您的帮助!
编辑:我试过使用BufferedImage和ImageIO,但每次都要从桌面加载,这让我很难理解。
发布于 2018-09-08 02:03:43
您必须编写一些代码来缓存这些内容;每次创建card对象时读取整个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构建过程中被移动。
https://stackoverflow.com/questions/52227277
复制相似问题