Вам придется написать некоторый код для их кеширования;чтение всего PNG или JPG каждый раз, когда вы создаете объект карты, значительно замедляет работу.Я собираюсь предположить, что EnumSuit и EnumRank (sidenote: Плохие имена; правильные имена - CardSuit и CardRank или даже просто Suit and 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
, который ищет предоставленный файл в том же месте, где и виртуальная машина находит файл 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.