从NetBeans执行上下文获取资源是可行的,但当从命令行执行jar时就不起作用了



我有一段代码,我在其中创建Java Actions并尝试将Icons与它们关联起来。代码的一个快照是

FileOpenCommand fileOpen = new FileOpenCommand(this);
fileOpen.putValue("ImageOnly", false);
fileOpen.putValue(Action.NAME, "Open");
fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("../resources/File-Open-icon24x24.png")));        
fileOpen.putValue(Action.SHORT_DESCRIPTION, "Opens the existing file.");
fileOpen.putValue("Group", "File");
fileOpen.putValue(Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_O, ActionEvent.CTRL_MASK));
this.commands.put("FileOpen", fileOpen);    

重音在我尝试将Action.SMALL_ICON属性设置为操作的行上。当在NetBeans环境中以调试模式或发布模式执行时,这项功能就可以工作。但当我尝试从命令行执行jar文件时,它失败了,出现了异常。

知道吗?与类路径有关吗?资源文件夹作为包放在主包中。

提前感谢!

我不完全确定在您的情况下抛出了什么异常,尽管假设它是从派生的NullPointerExceptionIOExceptionIllegalArgumentException

fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("../resources/File-Open-icon24x24.png")));

您的问题应该通过在getClass()getResource()之间添加getClassLoader()来解决,如下所示:

fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getClassLoader().getResource("../resources/File-Open-icon24x24.png")));

此外,您的文件名,特别是扩展名必须准确无误。在这种情况下,您访问的是File-Open-icon24x24.png,无论实际文件是由Netbeans中的png还是PNG扩展的,它都可以正常工作,但一旦导出,扩展情况就很重要。

最后,如果这两个更改都不能解决您的问题,我会检查您的文件路径,因为很可能在某个地方出现了逻辑错误。

当在Netbeans中使用嵌入式资源时,您应该有一个资源文件夹,其中包含额外的文件夹或您需要的任何数据,这些数据似乎是您所拥有的,但该文件夹应该位于Netbeans项目的src文件夹中。getClass().getResource()返回包行顶部的目录,这意味着如果类包是com.example.code,那么编译器将查找与com处于同一级别的文件/文件夹。打开Netbeans src文件夹,您应该会看到初始的com文件夹。您的资源文件夹应该直接放在该文件夹旁边,这样它就会正确嵌入jar文件导出中。

在您的代码中,您的路径是../resources/File-Open-icon24x24.png,这让我很困惑为什么您以..开头。我看不到你的文件夹结构,所以我无法在这张纸条上给出确切的答案,但你可能访问了错误的位置,尽管我觉得你并不像你所说的那样,你的项目在Netbeans中正确运行。但是,由于上述位置的原因,资源文件可能无法正确编码到jar文件中。要测试jar文件实际包含的内容,请复制它(出于安全考虑),并将文件扩展名从jar更改为zip。然后,您可以在Windows资源管理器中查看其内容,并查看其目录结构。文件夹结构的另一个调试技巧是在您试图访问的URL处创建一个文本文件,以查看它的位置。

最新更新