动态将图像添加到JLabel

时间:2019-01-12 20:43:11

标签: java swing jpanel jlabel

我试图将图像动态添加到我的JLabel中,然后将JLabel添加到我的面板中。我的代码没有抛出任何错误,但是图像从未显示。

<!-- HTML -->

<div id="demo"></div>

编辑
因此,通过进一步的谷歌搜索,我想到了这种语法

public JFrameGamePlay(String playername, String playerselected) {
    initComponents();

    playerimage = "/Users/owner/Downloads/__Pikachu.png";
    ImageIcon pimage = new ImageIcon(playerimage);
    JLabel lblPlayer = new JLabel(pimage);
    pnlPlayer.add(lblPlayer);
    pnlPlayer.validate();
    pnlPlayer.repaint();
}

public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new JFrameGamePlay().setVisible(true);
        }
    });
}

但是当我运行代码时,出现此调试错误:

JLabel lblPlayer;
lblPlayer = new JLabel(new ImageIcon(getClass().getClassLoader().getResource("__Image1.png")));
pnlPlayer.add(lblPlayer);
pnlPlayer.validate();
pnlPlayer.repaint();

这是我希望如何显示数据的GUI布局-左侧是1个面板,右侧是1个面板-每个面板都有一个动态创建的标签并填充了图像。但是没有图像被填充。 enter image description here

编辑2
我在2个面板周围添加了黑色边框,并且在加载JForm时,两个面板都没有显示。因此,似乎每个人都告诉我,NetBeans中的GUI设计是很麻烦的。如何在我的代码后面动态地在左右两个面板上添加大小分别为143、246的两个面板?

编辑3
仍然没有芥末酱,我正在使用以下语法:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
  at javax.swing.ImageIcon.<init>(ImageIcon.java:217)

}

3 个答案:

答案 0 :(得分:1)

使用ImageIO.read(File)来读取Image。喜欢,

File playerimage = new File("/Users/owner/Downloads/__Pikachu.png");
ImageIcon pimage = new ImageIcon(ImageIO.read(playerimage));
JLabel lblPlayer = new JLabel(pimage);
pnlPlayer.add(lblPlayer);

答案 1 :(得分:0)

NullPointerException来自getResource("__Image1.png"),返回null,因为找不到文件。您应该在类路径的前缀 中添加前缀(毕竟,ClassLoader会加载文件)。例如。如果图片位于您jar的res目录中(或您的类路径中):

JFrameGamePlay.class.getClassLoader().getResource("/res/__Image1.png")));

或者您可以直接给出完整的路径:

new JLabel(new ImageIcon("/images/thewall.png"));

示例:

public class JFrameGamePlay extends JFrame {

    private static final long serialVersionUID = 1L;

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(100, 100, 450, 300);
        JPanel contentPane = new JPanel(new BorderLayout());
        frame.setContentPane(contentPane);
        JLabel label = new JLabel(new ImageIcon("/images/thewall.png"));
        contentPane.add(label, BorderLayout.CENTER);
        JLabel label1 = new JLabel(new ImageIcon(JFrameGamePlay.class.getResource("/javax/swing/plaf/basic/icons/JavaCup16.png")));
        contentPane.add(label1, BorderLayout.NORTH);
        frame.setVisible(true);
    }

}

答案 2 :(得分:0)

  

我的代码没有抛出任何错误,但从未添加图像。

是的,很不幸,这是ImageIcon的工作方式。如果无法从您传递给它的文件名或URL中读取文件,它不会抛出异常或任何异常。该代码运行没有错误,但什么也没显示。

  

playerimage =“ /用户/所有者/下载/ __ Pikachu.png”;

如果您想从这样的固定位置读取文件,那么将 getClassLoader()。getResource()弄乱不会有帮助。这可能有助于读取与应用程序打包在一起的图像文件,而不有助于读取用户主目录中的图像。您最初的 new ImageIcon(imageLocation)方法适用于此。

[注意:我认为将文件名(或URL)直接发送到ImageIcon是一个好主意,就像您的原始代码一样。其他答案还建议使用ImageIO.read(),它有助于查看问题所在,但是一旦正常运行,您可以将其更改回 ImageIcon(filenameOrUrl)。但这没什么大不了。]

  

我试图将图像动态添加到我的JLabel中,然后将JLabel添加到我的面板中。

如果“动态”是指在某个事件发生时(在面板已经在屏幕上可见之后)执行此操作,那么我建议执行此操作。

也就是说,不要这样做...

JLabel lblPlayer = new JLabel(pimage);
pnlPlayer.add(lblPlayer);
pnlPlayer.validate();
pnlPlayer.repaint();

...您可以在屏幕上显示面板之前就将JLabel添加到面板中(因为没有文本或图像,所以不可见)。然后动态将ImageIcon添加到已经存在的JLabel中。您只需要调用 existingLabel.setIcon(...)。无需调用validate()或repaint()。