使用ImageIcon无法使用正确的路径显示图像

时间:2016-01-27 15:40:11

标签: java image swing user-interface icons

我一直遇到使用ImageIcon类在Java中显示图像的问题。代码非常简单,但它只是显示一个像

这样的窗口

this

 import javax.swing.*;
 public class TestButtonIcons {
    public static void main(String[] args) {
        ImageIcon usFlag = new ImageIcon("images/usFlag.png");
        JFrame frame = new JFrame();
        JButton jbt = new JButton(usFlag);
        frame.add(jbt);
        frame.setSize(500, 500);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}

我的图片位于src文件夹下,我的IDE也可以检测到它,因为它显示

this

另外,如果我将上述路径更改为完整路径,例如

"/Users/Mac/Documents/Java TB/ImageIcons/src/images/usFlag.png"

程序正常运行。

任何帮助将不胜感激。

谢谢!

4 个答案:

答案 0 :(得分:1)

确保使用“./path”,否则它可能认为它是绝对路径。 “”是当前目录,它表示相对路径而不是绝对路径。

答案 1 :(得分:1)

问题在于图像的位置。将图像放在源文件夹中。试试

  JButton button = new JButton();
  try {
    Image img = ImageIO.read(getClass().getResource("images/usFlag.png"));
    button.setIcon(new ImageIcon(img));
  } catch (IOException ex) {
  }

我认为图片在src/images

答案 2 :(得分:1)

ImageIcon(String)假设图像位于某个磁盘上。当您将图像放在src目录中时,大多数IDE会将图像捆绑到生成的Jar(AKA嵌入式资源)中,这意味着它们不再是磁盘上的“文件”,而是一个字节流一个zip文件,所以你需要以不同的方式访问它们。

首先使用ImageIO.read,与ImageIcon不同,当无法加载图片时,它会抛出IOException

您需要使用Class#getResourceClass#getResourceAsStream,具体取决于引用它的方式,例如......

BufferedImage image = null;
try {
    image = ImageIO.read(getClass().getResource("/images/usFlag.png"));
} catch (IOException ex) {
    ex.printStackTrace();
}

请查看Reading/Loading an Image了解详情

答案 3 :(得分:0)

您为ImageIcon的构造函数提供的路径是相对于您的类的位置的。 因此,如果您的类是org.example.TestButtonIcons,它将查找org / example / images / usFlag.png

希望这有帮助。