Загрузите 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