将资源(图像、声音片段等)嵌入Java项目中,然后使用这些资源。

30

我已经搜索了一种在Java项目中嵌入资源并在控件(例如JLabel)中使用该嵌入资源的方法(使用Eclipse v3.6.0)。我已经看到了从文件系统引用资源的方法。一旦项目开发完成,我希望将应用程序发布为可执行文件。需要注意的是,这些可执行文件将部署/启动到Windows、*NIX和Linux平台。

我知道在Visual Studio世界中可以做到这一点,但我对如何在Java/Eclipse IDE中实现此目标非常不熟悉。另外一个问题是,如何让Eclipse创建项目作为可执行文件,以便可以启动它?

非常感谢任何帮助。

马克

更新1:

根据BalusC的回答,我想分享解决我的问题的代码。我的类位于"Viking.Test"包下,然后我将图像文件放置在"Viking.Test.Resources"包下。这都是在Eclipse中将图像导入项目中完成的。

  1. 通过右键单击项目->导入->常规/文件系统进行导入源。
  2. 选择包含要导入的图像的文件夹
  3. 选择 "Project/src/Viking/Test/Resources" 作为'Into folder'参数
  4. 没有更改任何选项,然后点击"完成"
在源文件中,我添加了以下代码将图像插入到 JLabel (LblLogo) 中。
try
{
  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  InputStream input = classLoader.getResourceAsStream(
    "Viking/Test/Resources/MyImage.jpg");
  Image logo = ImageIO.read(input);
  LblLogo = new JLabel( new ImageIcon( logo ) );
  LblLogo.setBounds(20, 11, 210, 93);
  getContentPane().add(LblLogo);
}
catch ( IOException e ) {  }
1个回答

21

只需将这些资源放在源/包结构中,并使用ClassLoader#getResource()getResourceAsStream()从类路径中通过完全限定的包路径获取它们,获得URLInputStream

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
InputStream input = classLoader.getResourceAsStream("/image.gif");
// ...

或者如果它与当前类在同一个包中,您也可以按以下方式获取:

InputStream input = getClass().getResourceAsStream("image.gif");
作为一个附加问题,我该如何让Eclipse创建项目并将其作为可执行文件启动?
右键单击Java项目>导出>Runnable JAR文件。

谢谢BalusC,我已经解决了。唯一奇怪的是,在一个机器上右键单击Java项目->导出->可运行的JAR文件可以工作,但在另一个机器上却不行。在不能工作的那台机器上,我可以发出命令“java -jar MyJarFile.jar”,它就会运行。在导出过程中,如果我选择“将所需库打包到生成的JAR中”,我会收到错误消息“找不到主类。程序将退出”。需要找出原因,但我完全不理解。 - lordhog
自从Eclipse 3.5以来,有些事情已经发生了变化。机器上运行的是哪个版本?最简单的方法是使用Ctrl+F11执行一次,这样它就会被保存为最后一个Run As配置,您可以在导出过程中选择它。 - BalusC
好的,在家里我运行的是Java v6 Update 21和Java v6 Update 20,但其中一个无法工作。我不知道为什么会有问题,但我卸载了Java并重新安装了Java。重新安装Java后,我能够双击并执行jar文件。很酷。我不确定问题出在哪里。现在另一个问题是,即使我关闭窗口,“javaw.exe”的实例仍在运行。天啊,我得习惯这个Java东西。感谢BalusC提供的所有帮助! - lordhog
好的,关于“javaw.exe”的一个实例仍在执行的事实,我发现我需要调用描述如下的System.exit(0)函数。这里 - lordhog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接