Использование изображений в IntelliJ - PullRequest
0 голосов
/ 07 сентября 2018

Я разрабатывал покерную игру для стороннего проекта, чтобы познакомиться с использованием изображений и разработкой графического интерфейса с IntelliJ и java в целом. Сейчас я нахожусь на этапе, когда я хочу назначить изображение отдельной карте из коллекции изображений карт, которые есть на моем рабочем столе.

Есть ли какой-то конкретный ресурс о добавлении моей папки изображений в какую-то другую папку внутри самого проекта, чтобы я мог загрузить их прямо из проекта, а не с рабочего стола. Кроме того, как можно назначить эти изображения?

В настоящее время у меня есть класс карт, который создается из двух классов Enum, в которых хранится SUIT, и класса, в котором хранится RANK (значения).

Карта карты = новая карта (костюм EnumSuit, ранг EnumRank, "необходимо применить изображение в этой части)

Извиняюсь за плохое объяснение и спасибо за любую помощь!

Редактировать: я пытался использовать BufferedImage и ImageIO, но мне сложно каждый раз приходиться загружать его с рабочего стола.

1 Ответ

0 голосов
/ 07 сентября 2018

Вам придется написать некоторый код для их кеширования;чтение всего 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...