我试图将图像动态添加到我的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个面板-每个面板都有一个动态创建的标签并填充了图像。但是没有图像被填充。
编辑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)
}
答案 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()。