无法将JLabel添加到JPanel

时间:2014-12-11 23:44:47

标签: java swing jlabel imageicon

我有这段代码:

  ImageIcon ii = new ImageIcon("https://c1.staticflickr.com/9/8384/8682624224_4e44bf947d_h.jpg"); 
  subStream.add(new JLabel(ii));

这意味着将带有照片的JLabel添加到名为JPanel的{​​{1}}。 但它不起作用,没有错误或任何东西。为什么这样?

enter image description here

图像应该出现在第三个JPanel中,就在按钮上方。

2 个答案:

答案 0 :(得分:4)

要注意的事情......

  • ImageIcon可能会无声地失败...我知道这很烦人...这是因为......
  • ImageIcon使用后台线程加载图片,这是因为它设计为允许可能需要时间来完全实现图像的慢源(拨号网络)。

您应该使用ImageIO.read来测试URL以降低下载图片的潜在问题。如果由于某种原因无法加载图像,则会抛出IOException,并且会阻止图像完全加载,因此请注意

有关详细信息,请参阅Reading/Loading an Image

例如......

Downloaded Image

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.HeadlessException;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                try {
                    BufferedImage img = ImageIO.read(new URL("https://c1.staticflickr.com/9/8384/8682624224_4e44bf947d_h.jpg"));
                    JLabel label = new JLabel(new ImageIcon(img));

                    JFrame frame = new JFrame("Testing");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(label);
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException exp) {
                    exp.printStackTrace();
                }
            }
        });
    }

}

因此,这会将图像和Web服务器作为潜在问题(至少在我的网络中)进行折扣,您的代码必定存在其他问题。考虑提供一个runnable example来证明您的问题。这将减少混淆和更好的响应

答案 1 :(得分:1)

您正在调用ImageIcon(String filename)构造函数。尝试使用URL:

ImageIcon icon = new ImageIcon(new URL("your URL"));

// Imports
// ...

public class MyFrame extends JFrame
{
    public MyFrame()
    {
        super("Test");
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        try
        {
            URL url = new URL("http://upload.wikimedia.org/wikipedia/it/0/0b/Vegeta_-_Sigla_Iniziale_Dragon_Ball_Kai.jpg");

            getContentPane().add(new JLabel(new ImageIcon(url)));
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }

        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(() ->
        {
            new MyFrame().setVisible(true);
        });
    }
}