在另一台机器上的JAR文件中显示jLabel图标的问题

问题描述 投票:0回答:1

我正在构建一个普通的Java项目,需要将其作为Windows上的JAR应用程序进行部署。这种类型的应用程序是StandAlone软件,它在构建该应用程序时从我正在使用的计算机上加载所有内容。它包含一个徽标,我确实需要使其可见。它可以在我的机器上完美运行,因为它总是在PC上找到包含此徽标的目录,但是我需要一种方法来使此徽标内置在我的应用程序中,或者即使我与该文件夹共享也可以从项目文件夹中加载它其他机器来运行我的应用。因此,无论文件夹在其他计算机中的位置如何,我都希望使每台运行我的应用程序的计算机都能看到此徽标。我正在使用Netbeans 1.8

提前感谢:)

enter image description here

java image jar icons embedded-resource
1个回答
0
投票

带有徽标...是在窗口的右上角表示图标吗?我将使用一个从可执行jar内部进行操作的示例。但是,此概念类似于读取要打包在jar中的任何资源。

这里有两个关键概念,不同于您不是从jar内运行时,仅读取普通文件。事情的运作方式有所不同。

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

请注意,我们不提供文件路径,而是以流形式加载此资源(如果它的位置在jar文件内部。)

这里需要相对路径,相对于jar中文件的位置,相对于Java'main'的执行根。这意味着对于与正在执行Java的目录位于同一目录中的文件,它需要在文件名前面加上斜杠。很重要。在罐子外面,您将不需要它。在一个罐子里,前面的斜杠需要在这个相对目录中……在这里说。相对路径,不是绝对路径...相对于从jar内部运行Java代码的位置。

第三件事是……您正在使用Maven吗?如果是这样,为了在构建项目时将资源放入jar中,您需要在POM文件中告诉Maven。

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



    </build> 

...在您的POM中最后一个/ build之前的某个位置。

否则...它甚至都不会进入您的罐子。然后,将资源放入该POM指令中看到的文件夹中。它在您的项目中src / my-resources

Maven移动它,执行操作,然后在根目录下生成可执行jar时,将其放入根目录中的jar中。这就是为什么我的文件的相对路径/。如果我将其放在该src / my-resources目录下的一堆文件夹中……我必须在我的文件名之前加上相对路径,以便该程序知道src / my-resources中要查找的位置.. 。更深。

虽然我只是使用根。

我希望你能走。有时候,对于某些事情,getResource不会削减它,您需要切换为使用getResourceAsStream。取决于您在做什么。

我希望这能给您一些起点。 jar不同于从磁盘上查看位置的绝对路径的环境。有一种方法论。您不再关注文件系统;您正在罐子里寻找它,没有文件系统或C:。你在鱼缸里。您还需要在鱼缸中找到资源,而不是在文件系统中。而且,在构建项目时,您还必须确保将文件与您一起放入鱼缸中……否则,甚至根本找不到该文件。并且不要忘记代码中的相对路径...在常规文件系统上不需要的斜线。

祝你好运!

© www.soinside.com 2019 - 2024. All rights reserved.