我有一个代码,我在其中创建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文件时,它会失败,但是例外。
有什么想法吗?与classpath有什么关系? Resources文件夹作为主包中的包。
提前致谢!
答案 0 :(得分:1)
我不完全确定您的案例中会抛出什么异常,但假设它是NullPointerException
,IOException
或IllegalArgumentException
派生自
fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getResource("../resources/File-Open-icon24x24.png")));
只需在getClassLoader()
和getClass()
之间添加getResource()
即可解决您的问题,如下所示:
fileOpen.putValue(Action.SMALL_ICON, new ImageIcon(getClass().getClassLoader().getResource("../resources/File-Open-icon24x24.png")));
此外,您必须准确地使用文件名,特别是扩展名。在这种情况下,您正在访问File-Open-icon24x24.png
,无论实际文件是否在Netbeans中由png
或PNG
进行扩展,它都将正常运行,但一旦导出,扩展案例就会很重要。< / p>
最后,如果这些更改都没有解决您的问题,我会检查您的文件路径,因为在某个地方很可能出现逻辑错误。
在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
处创建一个文本文件,以查看它的放置位置。