【问题标题】:How to set icon image for swing application?如何为 Swing 应用程序设置图标图像?
【发布时间】:2011-11-03 21:59:11
【问题描述】:

我见过许多不同的示例,展示了如何设置 JFrame 的IconImage,以便应用程序使用该图标而不是标准咖啡杯。它们都不适合我。

这是“我的”代码(大量借用自其他帖子和整个互联网):

public class MyApp extends JFrame
{
    public MyApp()
    {
        ImageIcon myAppImage = loadIcon("myimage.jpg");
        if(myAppImage != null)
            setIconImage(myAppImage.getImage());
    }

    private ImageIcon loadIcon(String strPath)
    {
        URL imgURL = getResource(strPath);
        if(imgURL != null)
            return new ImageIcon(imgURL);
        else
            return null;
    }
}

当调用getResource() 方法时,此代码在loadIcon 中失败。对我来说,这里只有两种可能性:(1)myImage.jpg 位于错误的目录中,或者(2)getResource() 不喜欢我的图像(我必须在 Photoshop 中将其从 CMYK 转换为 RGB,所以我可以用ImageIO 在其他地方使用相同的图像。)

我已经使用System.out.println(new File(".").getAbsolutePath()); 技巧来定位应该存储图像 JPG 的目录,但仍然没有任何效果。我随后将 JPG 放在了项目中的几乎每个目录中,只是为了排除文件位置是罪魁祸首。

所以这让我相信getResource() 不喜欢 JPG 本身。但我现在已经用尽了我对 Swing 强大而广阔的世界中的图像和图标的理解。

我的 JPG 在其他图像查看器中加载良好,因此也排除了这种情况。有人有什么想法吗?

提前致谢!

【问题讨论】:

  • 要检查问题是否出在 URL 上,请尝试:System.out.println("estimated number of bytes in the file = " + imgURL.openStream().available());
  • 感谢 toto2 - 现在我们终于到了某个地方!那行抛出一个带有“null”消息的异常......很容易成为我见过的最糟糕和最没有帮助的异常消息。有什么线索吗?
  • available 根据 api 来说并不是一个坚如磐石的方法,所以我们不能得出太多的结论。您可以尝试将openStream().avalaible() 拆分为两条不同的行,以查看错误来自何处。我的猜测是您的图像很好,但无法定位。既然你用的是NetBeans,也可以看看这个tutorial
  • @Mar,为什么没有什么对你有用?为什么这篇帖子 (stackoverflow.com/questions/7181699/…) 中的建议对你有用,而对其他人有用?为什么不能像以前要求的那样发布 SSCCE ???我们不是读心术的人,我们无法猜测为什么它适用于其他所有人而不适用于您!!!
  • 抱歉,当人们继续发布问题而没有解决问题所需的所有必要信息时,我会感到冒犯。你继续浪费每个花时间阅读这个问题的人的时间。不仅如此,当您不希望我在这里帮助您时,您还敢直接从我的博客向我发送电子邮件寻求帮助!

标签: java image swing icons


【解决方案1】:

把图片放在类路径的根目录下,说getResource("classpath:myimage.jpg");

您的代码的问题是 jvm 不确定在哪里查找图像文件,因此它返回 null。

这是一个关于classpath的不错的链接

【讨论】:

  • 我理解类路径是 JRE 将在其中查找 .class 文件的目录。如果这是正确的,那么我的 NetBeans 会自动创建一个相当复杂的 build/ 目录,其中有一个名为 classes/ 的文件夹,它本身包含一个我的顶级 com/ 包 META-INF/ 和 res/。我已将图像放置在这些目录中的每一个中,并像您指定的那样在 getResource 调用中为“类路径:”字符串添加前缀。还是不行...我仍然认为它不喜欢 JPG
【解决方案2】:

我尝试过关注与您一样的question 的答案。它对我有用。

尝试将图像放在 src 之外的单独文件夹中 文件夹。然后,使用 ImageIO 加载您的图像。 (2013 年 8 月 27 日 0:18 回答 AndyTechGuy)

frame.setIconImage(ImageIO.read(new File("res/icon.png")));

【讨论】:

    【解决方案3】:

    应该是

    if(imgURL != null)
               ^
    

    而不是

    if(imgURL !- null)
    

    URL imgURL = this.getClass().getResource(strPath);
    

    而不是

    URL imgURL = getResource(strPath);
    

    如果"myimage.jpg"MyApp.class 在同一个目录中,那么它工作正常

    【讨论】:

    • 谢谢 - 但第一个 (imgURL !- null) 显然是一个错字,因为它永远不会编译。按照您的建议进行第二次更改,并确保图像与 MyApp.class 位于同一文件夹中。还是不行……
    【解决方案4】:

    两个建议:

    1. 尝试使用getClass().getResource("x.jpg"),并将文件直接放在与您所在班级的.class 文件相同的文件夹中。
    2. 确保名称大小写相同 - 某些操作系统区分大小写,而在 JAR 中,所有内容都区分大小写。

    【讨论】:

      【解决方案5】:

      您可以尝试在文件名前使用“/”。

      getClass().getResource("/myimage.jpg")
      

      如果您查看您的构建输出文件夹(目标),您可以查找您尝试从中获取资源的类。 您的资源可能会被复制到上面的某些文件夹中。

      例如,您的目标目录可能如下所示:

      target
       |- de.example.app
           |- Main.class
       |- Main-x.y.z.jar
       |- myimage.jpg
      

      所以如果你只是去

      getClass().getResource("myimage.jpg")
      它将在文件夹 target/de/example/app 下查找,但不会在那里找到 jpg。
      您需要告诉他您要查看根文件夹 (target/**)。这就是为什么你需要在你的文件之前放置一个"/"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-26
        • 2012-01-03
        • 2020-07-01
        • 1970-01-01
        • 2011-07-18
        相关资源
        最近更新 更多