Java 试图为JLabel设置图像图标,但URL返回null
试图为Java 试图为JLabel设置图像图标,但URL返回null,java,image,swing,embedded-resource,javax.imageio,Java,Image,Swing,Embedded Resource,Javax.imageio,试图为JLabel设置图像图标,但返回nullURL 我正在使用Netbeans,并在我的项目中包含background.png,但它仍然返回null import java.awt.image.BufferedImage; import java.net.URL; import javax.imageio.ImageIO; import javax.swing.*; public class NewClass extends JFrame { JLabel o = new JLab
JLabel
设置图像图标,但返回null
URL
我正在使用Netbeans,并在我的项目中包含background.png,但它仍然返回null
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
public class NewClass extends JFrame {
JLabel o = new JLabel();
public NewClass() {
createImage("background.png");
add(o);
setVisible(true);
setSize(100, 100);
setResizable(false);
}
public static void main(String[] args) {
new NewClass();
}
public void createImage(String str) {
URL url = getClass().getResource(str);
try {
BufferedImage image = ImageIO.read(url);
o.setIcon(new ImageIcon(image));
} catch (Exception e) {
e.printStackTrace();
}
}
}
堆栈跟踪中的错误详细信息:
java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1388)
at Test.NewClass.createImage(NewClass.java:32)
at Test.NewClass.<init>(NewClass.java:18)
at Test.NewClass.main(NewClass.java:26)
它可以工作,但在background.png不存在的情况下容易出错?
谢谢
编辑:components-SplitPaneDemo2Project-这是netbeans项目的名称,背景png直接位于该文件夹中
位于此处:
C:\Users\John\Documents\NetBeansProjects\components-SplitPaneDemo2项目
截图:
我对您的代码进行了测试,做了一些更改,效果良好:
public class NewClass extends javax.swing.JFrame {
JLabel o = new JLabel();
public NewClass() {
initComponents();
createImage("background.png");
add(o);
setVisible(true);
setSize(100, 100);
setResizable(false);
o.setLocation(20, 20);
o.setSize(100, 25);
}
public void createImage(String str) {
URL url = getClass().getResource(str);
try {
BufferedImage image = ImageIO.read(url);
o.setIcon(new ImageIcon(image));
} catch (Exception e) {
e.printStackTrace();
}
}
....
}
在构造函数中,我为“o”设置了位置和大小
“background.png”必须位于“NewClass”的父包中
background.png在哪里?似乎找不到“background.png”。你说的“容易出错”是什么意思?此图像文件是应用程序的一部分。您可以确保它存在。我在学习本教程,他们提到了优雅的错误处理?我还试图理解为什么这个特定的方法即使始终是应用程序的一部分也不起作用-我已经编辑了它的位置。如果将字符串提供给
getResource(…)
,JRE将期望在加载它的类的同一个包中找到该图像。从上面的图片来看,它看起来确实不在正确的位置。已经有了。为什么还要再问一次?谢谢,你说得对。我把它放在src/test文件夹中,然后用netbeans清理并构建了这个项目。然而,我把它放在C:\Users\John\Documents\NetBeansProjects\components-SplitPaneDemo2Project\pic中一个名为pic的单独文件夹中,然后以某种方式引用它,而不是在项目包中显示凌乱的图像,这样会让它看起来更干净吗?同样,当我在命令行上运行时,图像和类也在同一个文件夹中工作也很好?是的,你可以这样做,但这样,你将使用图像的绝对路径,这可能会导致应用程序依赖于文件系统。如果你在你的应用程序包中使用图像,这个问题永远不会发生。“我是否会把它放在一个单独的文件夹中,让它看起来更干净?”这个文件夹很脆弱,在下一台机器上会失败。把图像放进罐子里。这是唯一明智的办法。当您有了更多的经验后,您可能会将所有图像放在一个Jar中,该Jar被添加到主Jar的运行时类路径中,但在不久的将来,请坚持使用简单的方法(如本答案所示)。
public class NewClass extends javax.swing.JFrame {
JLabel o = new JLabel();
public NewClass() {
initComponents();
createImage("background.png");
add(o);
setVisible(true);
setSize(100, 100);
setResizable(false);
o.setLocation(20, 20);
o.setSize(100, 25);
}
public void createImage(String str) {
URL url = getClass().getResource(str);
try {
BufferedImage image = ImageIO.read(url);
o.setIcon(new ImageIcon(image));
} catch (Exception e) {
e.printStackTrace();
}
}
....
}