我一直遇到使用ImageIcon类在Java中显示图像的问题。代码非常简单,但它只是显示一个像
这样的窗口
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也可以检测到它,因为它显示
另外,如果我将上述路径更改为完整路径,例如
"/Users/Mac/Documents/Java TB/ImageIcons/src/images/usFlag.png"
程序正常运行。
任何帮助将不胜感激。
谢谢!
答案 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#getResource
或Class#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
希望这有帮助。