我看过许多不同的例子,展示了如何设置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在其他图片查看器中加载正常,因此也排除了。有人有什么想法吗?
提前致谢!
答案 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)
两个建议:
getClass().getResource("x.jpg")
,并将文件直接放在与您所在班级的.class
文件相同的文件夹中。答案 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());
}
这真是太过分了!