如何为swing应用设置图标图像?

时间:2011-08-25 17:36:40

标签: java image swing icons

我看过许多不同的例子,展示了如何设置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;
    }
}

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

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

这让我相信getResource()对JPG本身不喜欢的东西。但是现在我已经厌倦了对Swing强大的世界中的图像和图标的理解。

我的JPG在其他图片查看器中加载正常,因此也排除了。有人有什么想法吗?

提前致谢!

6 个答案:

答案 0 :(得分:2)

将图像放在类路径的根目录中并说出getResource("classpath:myimage.jpg");

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

以下是关于classpath

的精彩链接

答案 1 :(得分:1)

应该是

if(imgURL != null)
           ^

而不是

if(imgURL !- null)

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

而不是

URL imgURL = getResource(strPath);

如果"myimage.jpg"位于MyApp.class

的同一个目录中,那么它可以正常工作

答案 2 :(得分:1)

我尝试过以下哪种答案适合与您类似的question。它对我有用。

  

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

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

答案 3 :(得分:0)

两个建议:

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

答案 4 :(得分:0)

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

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/**)下的内容。这就是为什么您需要在文件前放置"/"

答案 5 :(得分:-11)

好的,我明白了。出于某种原因,显然您需要为要与其他单元格不同的特定单元格添加特殊条件。观察我的原始代码:

if(row == 2 && column == 2) 
    c.setBackground(new java.awt.Color(0, 0, 255)); 
    else 
        c.setBackground(table.getBackground()); 

这不起作用,因为我需要将它包装在条件中。

if (!table.isRowSelected(row)) 
{ 
    if(row == 2 && column == 2) 
        c.setBackground(new java.awt.Color(0, 0, 255)); 
    else 
        c.setBackground(table.getBackground()); 
} 

这真是太过分了!

相关问题