我有一段代码,我在其中创建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文件时,它失败了,出现了异常。
知道吗?与类路径有关吗?资源文件夹作为包放在主包中。
提前感谢!
我不完全确定在您的情况下抛出了什么异常,尽管假设它是从派生的NullPointerException
、IOException
或IllegalArgumentException
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
处创建一个文本文件,以查看它的位置。