【问题标题】:Dynamically Add Image To JLabel [closed]将图像动态添加到 JLabel [关闭]
【发布时间】:2019-01-12 20:43:10
【问题描述】:

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

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();

但是当我运行代码时,我得到了这个调试错误:

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

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

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

编辑 3
仍然没有芥末,我正在使用这种语法:

public JFrameGamePlay() {
initComponents();
JPanel leftpanel = new JPanel();
JPanel rightpanel = new JPanel();
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftpanel, rightpanel);

JLabel lblPlayer = new JLabel(new ImageIcon("/resources/__Image1.png"));
leftpanel.add(lblPlayer);
leftpanel.validate();
leftpanel.repaint();

}

【问题讨论】:

  • 如果 Elliott 的回答不能解决您的问题,那么您将需要在您的问题中发布一个有效的minimal reproducible example,这是一个可编译和可运行的小型程序,为我们演示您的问题。请阅读链接。还可以使用在线提供的图片以便于测试。
  • 致电revalidaterepaint pnlPlayer
  • 或者更好的是——让那个 JLabel 已经在 pnlPlayer JPanel 中,并用一个包含空白图像的 ImageIcon 填充它,该图像是播放器图像的大小。
  • @MadProgrammer - 如果我添加 pnlPlayer.revalidate();和 pnlPlayer.repaint();仍然没有显示
  • @DoctorFord 那么我同意 Hovercraft 的观点,没有更多的上下文,我们无能为力了

标签: java swing jpanel jlabel


【解决方案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);

【讨论】:

  • 当然最好使用资源而不是文件,所以当 OP jar 是程序时.... 1+
  • 使用这个没有图像显示在我的标签 - 与上面相同的问题
【解决方案2】:

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);
    }

}

【讨论】:

  • 图像位于我的资源文件夹中,该文件夹是源文件夹的子文件夹。我试着按照你的建议做 /resources/__Image1.png 但我仍然得到空异常?我编辑我的代码以读取 JLabel lblPlayer = new JLabel(new ImageIcon("/resources/__Image1.png"));并且没有抛出错误,但是表单加载时图像没有出现
  • @DoctorFord 使用new ImageIcon(class.getResource("/path/relative/to/source/folder/image.png")) 从类路径加载或使用new ImageIcon("/full/path/to/image.png") 从硬盘加载。请注意,如果您在 Windows 上运行,路径可能区分大小写。如果图像位于源文件夹的子文件夹中,则 new JLabel(new ImageIcon(JFrameGamePlay.class.getResource("/resources/__Image1.png"))) 应该可以工作。
  • @DoctorFord 尝试复制粘贴我给出的示例,它可以工作(至少与第二张图像一起使用。使用您的完整路径__Image1.png 而不是我使用的/images/thewall.png)。
【解决方案3】:

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

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

playerimage = "/Users/owner/Downloads/__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()。

【讨论】:

  • 我喜欢这种方法。如何将资源文件夹中的图像设置为 setIcon?当我尝试时,出现 URL 无法转换为图标的编译错误。这是我的语法 lblPlayer.setIcon(getClass().getClassLoader().getResource("/resources/__Pikachu.png"));
  • 必须做类似 lblPlayer.setIcon( new ImageIcon( getClass().getClassLoader().getResource("/resources/__Pikachu.png")) );
  • 这消除了编译错误 - 但我在线程“AWT-EventQueue-0”java.lang.NullPointerException 中得到一个异常调试错误
  • 好吧,我们都必须在某个时候调试 NullPointerException。异常消息应该给你一个行号来帮助你追踪它。您可以尝试的一件事是 lblPlayer.setIcon(new BallIcon(60, java.awt.Color.ORANGE)) 并查看标签内容是否与图像加载内容分开工作。 BallIcon.java source
  • 这是我的全部错误的 pastebin - 你能帮我找到它吗?它列出了多个行号pastebin.com/12SCYEQ7
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多