将图像加载到JLabel不起作用

时间:2014-02-18 14:23:44

标签: java eclipse swing jlabel javax.imageio

我尝试使用JLabel显示图像。这是我的项目导航器: enter image description here

SettingsDialog.java我想使用以下代码显示图像:

        String path = "/images/sidebar-icon-48.png";
        File file = new File(path);
        Image image;
        try {
            image = ImageIO.read(file);

            JLabel label = new JLabel(new ImageIcon(image));
            header.add(label); // header is a JPanel
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

代码抛出异常:无法读取输入文件!

图像的路径是错误的吗?

3 个答案:

答案 0 :(得分:4)

不要从文件中读取,从类路径中读取

image = ImageIO.read(getClass().getResource(path));
-or-
image = ImageIO.read(MyClass.class.getResource(path));

当您使用File对象时,您告诉程序从文件系统中读取,这将使您的路径无效。您正在使用的路径是正确的,当您从 进行读取时, 正在进行。

请参阅embedded resource上的wiki。另请参阅getResource()


更新测试运行

enter image description here

package org.apache.openoffice.sidebar;

import javax.swing.*;

public class SomeClass {
    public SomeClass() {
        ImageIcon icon = new ImageIcon(
              SomeClass.class.getResource("/images/sidebar-icon-48.png"));
        JLabel label = new JLabel(icon);

        JFrame frame = new JFrame("Test");
        frame.add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                new SomeClass();
            }
        });
    }
}

答案 1 :(得分:1)

“/ images / sidebar-icon-48.png”是根路径。在Windows上将是c:\ images \ sidebar-icon-48.png或d:\ images \ sidebar-icon-48.png,具体取决于当前驱动器(java将/转换为\ - 不是问题)。 Linux图像是root的子/images/sidebar-icon-48.png需要相对于类或相对于具有该类的jar加载(如果您不想将图像存储在jar中。

在大型项目中,很高兴在jar之外拥有图像和其他资源,因此jar更小,更重要的是它可以轻松更改资源而无需摆弄罐子/战争。

由于您似乎正在为开放式办公室添加一个附加功能,因此您必须将所有内容保存在jar中,因此peeskillet的回答是正确的。但请确保您的图像文件夹正在包装中。使用jar命令解压缩jar或将文件重命名为zip并解压缩。

或检查并修复项目设置。如何在日食中制作一个罐子......最新的罐子有一个wizard that makes an ant script或者这个SO

答案 2 :(得分:1)

尝试直接使用它:

    JLabel label = new JLabel(new ImageIcon(path));

并删除这些行:

File file = new File(path);

image = ImageIO.read(file);

如果仍然存在错误,请粘贴以下错误