2012-10-02 68 views
1

好的,所以我创建了一个缓冲图像以显示在JLabel上。当我显示文件位置时,它需要在我想要访问的文件夹前面有一个src /,否则会出现错误,并且我不会看到缓冲图像...我知道如果将'src /'在resImg之前,BufferedImage不会显示在IDE之外。谁能帮忙? 这是在IDE内部工作的代码。从.jar文件向外运行时,图像不显示。为什么我的BufferedImage不会显示在.jar文件中?

static File f = new File("src/resImg/banner.png"); 

try { 
     banner = ImageIO.read(f); 
     picLabel = new JLabel(new ImageIcon(banner)); 
     LabelPanel.add(picLabel); 
    } catch (IOException ex) { 
     Logger.getLogger(GameStart.class.getName()).log(Level.SEVERE, null, ex); 
    } 
+2

您只能引用文件系统上的“文件”。对于那些在罐子里,你应该把它们当作资源。 –

回答

2

当资源在jar文件中时,它不是本地文件系统上的文件。您应该使用

URL imageSource = getClass().getResource("/resImg/banner.png"); 
if (imageSource == null) { 
    // Handle the resource being missing 
} 
picLabel = new JLabel(new ImageIcon(imageSource)); 

在这里,我们从类加载器,这显然会有权访问文件的jar文件获取的资源。

+0

如果我处于静态方法,该怎么办?我将如何继续?它是说getClass()是一种非静态方法。 – Notchos

1

如果你想从罐子获得图像,使用水木清华这样的:

URL imageurl = getClass().getResource("/images/imagename"); 
0

最有可能的原因是,你的形象是不是打包的jar文件内(以JAR/zip工具验证这一点)。

如果图像是有,但不显示,那是因为你试图从相对文件系统读取该工作目录(它肯定是不存在)

所以,正确的解决办法是将读取图像类路径:

Thread.currentThread().getContextClassloader().getResourceAsStream(... path to your image relative to jar root ---) 
1

您无法为JAR文件中的资源创建File对象。改用它。

URL imgurl = this.getClass().getClassLoader().getResource("resImg/banner.png"); 
picLabel - new JLabel(new ImageIcon(imgurl)); 

希望这会有所帮助。

1

你必须找到一个父目录,relativ路径可以从像

  • workspace目录
  • 目录的过程开始

的relativ路径是“realtiv”从这里开始java进程是从开始的,所以路径可能会不时变化。

如果图片放在罐子里,你可以使用

getClass().getResource("relativ jar path") 

寻找图像。罐子本身知道它放在哪里。

相关问题