Java 利用IntelliJ中的图像

Java 利用IntelliJ中的图像,java,image,intellij-idea,Java,Image,Intellij Idea,我一直在为side项目开发一款扑克游戏,介绍自己如何使用IntelliJ和java进行图像和GUI开发。我现在正处于一个阶段,我想从桌面上的一组卡片图像中为一张卡片分配一个图像 是否有任何具体的资源可用于将我的图像文件夹添加到项目本身的某个其他文件夹中,以便我可以直接从项目而不是从桌面加载这些图像。此外,如何分配这些图像 目前,我有一个card类,它是从存储SUIT的2个Enum类和存储rankvalue的另一个Enum类构建的 Card Card=新的CardEnumSuit套装,EnumRa

我一直在为side项目开发一款扑克游戏,介绍自己如何使用IntelliJ和java进行图像和GUI开发。我现在正处于一个阶段,我想从桌面上的一组卡片图像中为一张卡片分配一个图像

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

目前,我有一个card类,它是从存储SUIT的2个Enum类和存储rankvalue的另一个Enum类构建的

Card Card=新的CardEnumSuit套装,EnumRank等级,需要在此部分应用图像

如果我的解释不好,我深表歉意,谢谢你的帮助


编辑:我尝试过使用BuffereImage和ImageIO,但每次都要从桌面加载,这让我很难受。

您必须编写一些代码来缓存这些;每次创建卡片对象时读取整个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始终从磁盘加载,这就是它被标记为私有的原因。注意,它使用MyClassName.class.getResource机制,该机制在VM查找文件MyClassName.class的位置查找提供的文件

所以,如果你有这个:

C:\MyProjects\card\u exercise\src\card.java

您的IDE、maven、gradle、ant或任何您用来编译它的东西最终使类文件位于此处:

C:\MyProjects\card\u exercise\bin\card.class

然后,上面的代码片段将在以下位置查找,比如“4A.png”:

C:\MyProjects\card\u exercise\bin\cardImages\4A.png

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


这个机制x.class.getResource即使您创建了一个jar文件,并将您的类和图像组合在一起,也可以工作。请注意,eclipse会将非java文件直接从src复制到bin,在maven中,“resource”目录中的任何内容也会在maven构建过程中移动。

您使用的是swing/swt吗?它是一个web应用程序吗?我在我的项目中使用swing和awt,它不是一个web应用程序。它只是一个在本地Dekstop上运行的离线游戏。如果您使用Maven及其标准目录结构,您可以通过将文件添加到src/main/resources文件夹来从类路径加载图像。不幸的是,我只使用标准java项目,我刚刚阅读了有关Maven的文档,但没有使用该路线。我不确定现在开始向我的项目添加图像是否太迟了?我有一个功能齐全的扑克游戏,它的界面只在屏幕上显示每张牌的toString,而不是我想要使用的图像。哇,这是我希望得到的广泛答案。先生,您是圣人,我会研究您的建议,并尝试将其付诸实施。感谢您对命名约定的建议,只是想澄清一下,公共enum EnumRank是否在enum的名称中包含EnumRank并不重要?我觉得这是必须的,但现在我想我可以给一个类命名任何东西,所以我想这同样适用。枚举可以有任何名称。按照惯例,你应该像骆驼一样写作,从一个大写字母开始,但除此之外,什么都可以枚举“”不需要在名称中。