Загрузите Java-образ внутри пакета из класса в другой пакет

У меня есть Java-проект под названием MyProject. У меня есть несколько разных пакетов (простейшие имена для целей этого вопроса):

src/PackageA
src/PackageA/PackageAa
src/PackageA/PackageAa/PackageAaa
src/PackageB
src/PackageB/PackageBa
src/PackageB/PackageBa/PackageBaa

У меня есть класс

src/PackageA/PackageAa/PackageAaa/MyJavaFile.java

И у меня есть изображение

src/PackageB/PackageBa/PackageBaa/MyImage.png

Внутри MyJavaFile.java, я хотел бы объявить объект Image MyImage.png

Image img = new Image(....what goes here?...)

Как я могу это сделать?

Ответ 1

Вы можете вызвать Class.getResource и указать путь, начинающийся с /, или ClassLoader.getResource и не беспокоиться с /:

URL resource = MyJavaFile.class
      .getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");

или

URL resource = MyJavaFile.class.getClassLoader()
      .getResource("PackageB/PackageBa/PackageBaa/MyImage.png");

В основном Class.getResource позволит вам указать ресурс относительно класса, но я не думаю, что он позволяет вам использовать ".." и т.д. для навигации по каталогам.

Конечно, если вы знаете класс в правильном пакете, вы можете просто использовать:

URL resource = SomeClassInPackageBaa.class.getResource("MyImage.png");

(Я предполагаю, что вы можете передать URL в конструктор Image, а также getResourceAsStream на Class и ClassLoader.)

Ответ 2

вы можете использовать относительный путь, поскольку относительный путь представляет собой папку проекта.

 ImageIcon img = new ImageIcon("src/PackageB/PackageBa/PackageBaa/MyImage.png");

Ответ 3

/folderB/folderBa/folderBaa/MyImage.png

Изображение может храниться в папке проекта местоположения .eg: /images/MyImage.png

Тогда попробуйте:

Image img = new Image(/images/MyImage.png);

Использование пути к файлу невозможно при запуске программы в файле jar, особенно если программа загружается как апплет или приложение WebStart, тогда вы можете использовать ClassLoader для получения изображения.

используйте следующий код для загрузки изображений:

ClassLoader cldr = this.getClass().getClassLoader();

java.net.URL imageURL = cldr.getResource("/PackageB/PackageBa/PackageBaa/MyImage.png");
ImageIcon aceOfDiamonds = new ImageIcon(imageURL);

Ответ 4

Это лучший способ обработки всех изображений и значков в приложении JAR.

После того, как вы закрепили все ваши изображения и значки в свой собственный файл JAR - Настройте свой путь сборки, добавив файл JAR изображений на вкладку "Библиотеки", чтобы он теперь включался в ваш путь к классам.

Затем просто используйте следующие 3x строки кода в начале вашего constuctor для доступа к любому изображению, которое вам нужно для чего-либо, включая образ SystemTray, который не принимает простой ImageIcon в качестве основного значка ( странно, я знаю). Строки 3x:

  URL iconUrl = this.getClass().getResource("/image-iconb.png");
  Toolkit tk = this.getToolkit();
  imageIcon = tk.getImage(iconUrl);

(imageIcon - это просто объявленная конструктором Image variable) Теперь вы можете установить значок окна так же, как:

setIconImage(imageIcon );

и используют одну и ту же переменную при установке System TrayIcon, объявляя:

 trayIcon = new TrayIcon(imageIcon, "SystemTray Demo", popupMenu);

Вышеупомянутое позволяет легко и централизованно объявлять Images или ImageIcons, не рискуя не хранить ресурсы изображения в нужном месте. Это держит его красивым и аккуратным: JAR, содержащий все ваши изображения, автоматически скомпилированные во время выполнения и распространения вашей программы.

В качестве бонуса, как только JAR зарегистрирован в вашем пути к классу, вы можете в любое время добавлять любые другие изображения в один JAR в любое время без суеты. Все просто работает, а добавленные изображения мгновенно доступный вашему приложению.

Гораздо лучше, на мой взгляд.

Ответ 5

Используйте метод getResource для чтения ресурсов внутри корня src. Например, следующий код извлекает изображения из папки src/images.

// Get current classloader
ClassLoader cl = this.getClass().getClassLoader();
// Create icons
Icon saveIcon  = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon   = new ImageIcon(cl.getResource("images/cut.gif"));

В примере предполагается, что в файле JAR приложения есть следующие записи:

images/save.gif
images/cut.gif