如何为摆动应用程序设置图标图像?

问题描述:

我见过很多不同的例子,展示了如何设置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,所以我可以使用

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

因此,让我相信有一些getResource()不喜欢JPG本身。但是我现在已经用尽了我对Swing强大广泛世界中的图像和图标的理解。

我的JPG在其他图像查看器中加载得很好,所以这也被排除了。有人有主意吗?

在此先感谢!

+0

要检查问题是否与URL试试:'的System.out.println( “字节的估计数目在文件中=” + imgURL.openStream()可用());'。 – toto2

+0

感谢toto2 - 现在我们终于到了某个地方!该行用“null”消息抛出一个异常...容易出现我见过的最糟糕,最不有用的异常消息。任何线索? – IAmYourFaja

+0

根据api,'available'并不是一个坚实的方法,所以我们不能总结得很多。你可以尝试在两个不同的行上分割'openStream()。avalaible()'来查看错误来自哪里。我的猜测是你的图像很好,但无法定位。由于您使用的是NetBeans,因此您可以参阅本教程(http://netbeans.org/kb/docs/java/gui-image-display.html)。 – toto2

OK同一目录我想通了。出于某种原因,显然你需要为特定的细胞添加一个特殊的条件,使其与其他细胞不同。观察我的原始代码:

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()); 
} 

这是wasa douzy!

+0

什么?这是对这个问题的最佳答案吗? –

+3

这可能是最荒谬的答案(对自己的问题)! JTable和单元格的着色与设置JFrame的图标有什么关系? – dm76

把图像中的类路径的根说getResource("classpath:myimage.jpg");

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

这里是关于classpath

+0

我知道classpath是JRE将查找.class文件的目录。如果这是正确的,那么我的NetBeans会自动创建一个相当复杂的构建/目录,其中有一个名为classes /的文件夹,它本身包含我的*com/package,META-INF /和res /。我已经将图像放在这些目录中的每一个目录中,并像您指定的那样在getResource调用中为“classpath:”字符串添加前缀。仍然没有去...我仍然认为它不喜欢JPG – IAmYourFaja

一个很好的链接应该是

if(imgURL != null) 
     ^

,而不是

if(imgURL !- null) 

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

,而不是

URL imgURL = getResource(strPath); 

然后正常工作,如果"myimage.jpg"MyApp.class

+0

谢谢 - 但第一个(imgURL! - null)显然是一个错误,因为它永远不会编译。按照您的建议进行第二次更改,并确保图像与MyApp.class位于同一文件夹中。仍然没有去... – IAmYourFaja

两个建议:

  1. 尝试使用getClass().getResource("x.jpg"),并直接把文件相同的文件夹中.class文件你在类的
  2. 确保名称中的情况是相同的 - 有些操作系统区分大小写,在JAR中,一切都区分大小写。

我试过下面这是一个类似于你的同类question的答案。它适用于我。

试着把你的图像放在你的src 文件夹以外的单独文件夹中。然后,使用ImageIO加载您的图像。 (回答8月27日在'13 0:18 AndyTechGuy)

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