如何在JFrame上使用ImageIcon打开图像

3

我想在JFrame上使用Imageicon绘制一张图片,但是运行后界面为空白。以下是我的代码:

    public final class PICS

{

  public static final void main(String... aArgs)
  {   
      JFrame frame = new JFrame("IMAGE");
      frame.setVisible(true);
      frame.setSize(500,500);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      ImageIcon image = new ImageIcon("image/pic1.jpg");
      JLabel label = new JLabel("", image, JLabel.CENTER);
      JPanel panel = new JPanel(new BorderLayout());
      panel.add( label, BorderLayout.CENTER );
  } 
}

我对Java和这个网站的一切都很陌生,如果我漏掉了什么东西,我很抱歉。此外,我正在使用Eclipse,您可以使用特定的格式来使用图片吗?或者大小有限制吗?


请查看如何将图片添加到您的Eclipse项目。希望这能有所帮助 :-) - nIcE cOw
此外,这个答案试图以更好的方式解释整个事情 :-) - nIcE cOw
2个回答

2
两件事情。
首先,在您构建框架及其内容之后,将 `setVisible` 设为最后一次调用... 也就是说:
JFrame frame = new JFrame("IMAGE");
frame.setSize(500,500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ImageIcon image = new ImageIcon("image/pic1.jpg");
JLabel label = new JLabel("", image, JLabel.CENTER);
JPanel panel = new JPanel(new BorderLayout());
panel.add( label, BorderLayout.CENTER );
// Make me last
frame.setVisible(true);

两件事情,首先确保image/pic1.jpg存在,并且在当前执行环境下的image目录中。
如果该图像是嵌入式资源(位于Jar或应用程序内),则需要提供一个URL而不是String作为ImageIconString视为文件名...
ImageIcon image = new ImageIcon(PICS.class.getResource("image/pic1.jpg"));

例如。
我鼓励您使用JFrame#pack而不是JFrame#setSize,因为它会将框架调整为内容的首选大小...
我还鼓励您花时间阅读Java编程语言代码约定初始线程
我还鼓励您使用ImageIO而不是ImageIcon,因为它至少会在出现问题时抛出一个Exception
更新,测试图像路径
尝试将此添加到您的PICS类的构造函数中。这将至少告诉您图像不存在的位置...
try {
    ImageIO.read(PICS.class.getResource("image/pic1.jpg"));
} catch (IOException ex) {
System.out.println("Not in image/pic1.jpg");
}
try {
    ImageIO.read(PICS.class.getResource("/image/pic1.jpg"));
} catch (IOException ex) {
System.out.println("Not in /image/pic1.jpg");
}
try {
    ImageIO.read(PICS.class.getResource("resources/image/pic1.jpg"));
} catch (IOException ex) {
System.out.println("Not in resources/image/pic1.jpg");
}
try {
    ImageIO.read(PICS.class.getResource("/resources/image/pic1.jpg"));
} catch (IOException ex) {
System.out.println("Not in /resources/image/pic1.jpg");
}

2
我非常新手,对Java和这个网站都不熟悉。我建议您从阅读教程开始,特别是Swing教程。也许如何使用图标部分是一个很好的起点。示例代码将向您展示如何使用图标以及如何构造程序,以便在EDT上执行GUI代码。并发教程将解释为什么EDT很重要。

1
我已经查看了那些内容,这也是我能走到这一步的原因,但我在那里找不到解决我的问题的方法,虽然很可能只是需要更加注意或者从头开始阅读所有内容。但现在时间已经很晚了,我只想解决这个问题并且睡觉。 - EternalChronicle
1
@user2693212,「我已经看过那些了,所以才能走到这一步」- 那为什么你的代码看起来不像教程中的例子呢?为什么不在EDT上创建GUI?为什么在组件添加到框架之前就让框架可见?「我只需要更加注意它们」- 学习没有捷径。「但是现在已经很晚了,我只想解决问题并且休息一下」我们在这里帮助那些真心努力的人,疲倦不是忽视教程的借口。 - camickr
1
更具体地说,我查看了Imageicon和面板教程,这是我查看的第一个内容,因此它看起来不像我最终使用的代码,因为我在之后查看了很多其他教程和问题,并得出了上面的代码。另外,我并没有“忽略教程”,只是等到早上我完全清醒后再去阅读它们。 - EternalChronicle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接