проблема с отображением jLabel Icon внутри JAR-файла на другом компьютере - PullRequest
0 голосов
/ 07 января 2020

Я строю обычный Java проект, который мне нужно развернуть как приложение JAR на Windows. Этот тип приложения является программным обеспечением StandAlone, которое загружает все с компьютера, который я использую при создании этого приложения. Он содержит lo go, который мне действительно нужно сделать видимым. Он отлично работает на моей машине, потому что он всегда находит каталог, который содержит этот lo go на моем P C, но мне нужен метод для того, чтобы этот lo go был встроен в мое приложение, или я могу загрузить его из папка проекта, даже если я использую эту папку на других компьютерах для запуска моего приложения. Поэтому я хочу, чтобы этот lo go был видимым для каждой машины, на которой запускается мое приложение, независимо от того, где находится папка на других машинах. Я использую Netbeans 1.8

Заранее спасибо:)

enter image description here

1 Ответ

0 голосов
/ 29 февраля 2020

Под go ... Вы имеете в виду иконку в верхнем углу вашего окна? Я буду использовать пример этого внутри исполняемого фляги. Тем не менее, концепция похожа на чтение любого ресурса, который вы хотите упаковать внутри вашего jar-файла.

Здесь есть два ключевых понятия, которые отличаются от простого чтения обычных файлов, когда вы не запускаете изнутри jar-файла. Вещи работают по-другому.

java.awt.Image frameImage = new javax.swing.ImageIcon(
    getClass().getResource("/LotsaIcon.jpg")
).getImage();

Обратите внимание, что вместо указания путей к файлам мы загружаем этот ресурс в виде потока (если он находится внутри файла jar.)

Здесь требуются относительные пути, относительно расположения вашего файла в банке относительно root, из которого выполняется java 'main'. Это означает, что для файла, находящегося в том же каталоге, из которого выполняется java, требуется имя sla sh перед именем файла. Очень важно. Вне банки вам это не понадобится. Внутри банки должен быть этот предшествующий пункт sh ... чтобы сказать здесь, в этом относительном каталоге. Относительный путь, а не абсолютный ... относительно того, где код java запускается изнутри банки.

Третье: ... Вы используете maven? Если это так, чтобы получить ваш ресурс в jar при сборке проекта, вам нужно сообщить maven об этом в вашем файле POM.

        <resources>
          <resource>
            <directory>src/my-resources</directory>
            <includes>
              <include>**/*.txt</include>
              <include>**/*.jpg</include>
            </includes>
          </resource>
        </resources>



    </build> 

... где-то до этого последнего / build в вашем POM.

В противном случае ... он даже не попадет go в вашу банку. Затем поместите ресурс в папку, которую вы видите в этой директиве POM. Он есть в вашем проекте src / my-resources

Maven перемещает его, делает что-то и помещает его в ваш jar для вас в каталог root, когда он делает исполняемый jar ... в root уровень. Вот почему относительный путь / в моем файле. Если бы я поместил его в кучу папок в этом каталоге src / my-resources ... мне пришлось бы предшествовать моему имени файла с этим относительным путем, чтобы программа знала, где в src / my-resources искать ... глубже.

Я просто использую root, хотя.

Я надеюсь, что это поможет вам. Иногда, для некоторых вещей, getResource не обрезает его, и вам нужно переключиться на использование getResourceAsStream. Зависит от того, что вы делаете.

Надеюсь, это даст вам возможность начать. Jar - это другая среда, отличная от того, что находится на диске и смотрит на абсолютные пути к местам. В этом есть методология. Вы больше не смотрите на файловую систему; вы ищите в банке его, нет файловой системы или C :. Ты в аквариуме. Вы также должны найти свой ресурс в аквариуме, а не в файловой системе. И вы должны быть уверены, что ваш файл будет помещен в аквариум с вами, когда вы создаете свой проект ... или его вообще не найти. И не забывайте тот относительный путь в вашем коде ... предыдущий пункт sh, который вам не понадобится в обычной файловой системе.

Удачи!

...